Які самы хуткі спосаб, каб стаць на службу REST з дапамогай Java?

У мяне ёсць некалькі дапаможных метадаў, якія я напісаў у Java, для стварэння тэставых дадзеных у дачыненні да службы. Некалькі маіх калегаў, якія маюць адзін і той жа выпадак выкарыстання падумаў, што было б выдатна, калі б яны маглі паўторна выкарыстоўваць яго, але яны пішуць свае тэсты ў Perl і Python, адпаведна. Так што я маю на ўвазе, стоячы службу JSON REST, што б выкрыць гэтыя метады.

Я абмежаваў вопыт напісання вэб-прыкладанняў. Што б самы хуткі спосаб, каб устаць і разгарнуць сваю службу?

Я маю на ўвазе выкарыстанне зацьменне/вясной, каб зрабіць гэта і мурашка, каб разгарнуць на Jetty кантэйнеры. Але я хацеў бы пачуць ваш вопыт з гэтай нагоды. Акрамя таго, здаецца, некаторыя IDES/Убудовы маюць палепшаную падтрымку некаторых тэхналогій, чым іншыя. Таму я хацеў бы пачуць, што IDE/Plugins + стэк J2EE Technology + сервер (калі гэта мае значэнне) добрае спалучэнне для майго USECASE і чаму. Я хацеў бы прытрымлівацца праграмнага забеспячэння з адчыненым зыходным кодам.

11
Датычнай адказ, але я знайшоў пітон + gunicorn быць вельмі хуткім для прыняцця хуткіх макетаў REST, калі я інтэграцыя з сэрвісам 3 партыі
дададзена аўтар Ron Dahlgren, крыніца
Паглядзіце на стэк REST AirBnB, які з'яўляецца Jetty, Джэрсі і Джэксан. nerds.airbnb.com/httpjson-services-in-modern-java
дададзена аўтар Steve Kuo, крыніца
Дзякуй за адказ, Рон, але я сапраўды шукаю рашэнне Java, так як мой код на Java.
дададзена аўтар hyperlink, крыніца

9 адказы

Я лічу, выкарыстоўваючы Maven атрымлівае вас так хутка, як можна. Вось як вы можаце гэта зрабіць.

Ён выкарыстоўвае Resteasy рэалізацыі JAX-RS (на Java API для RESTful Web Services , афіцыйная частка Java EE 6).

Гэта ява вайна Maven праект з голай мінімальнай структурай. Гэта файлы:

-pom.xml
-src
 |
  --main
    |
     --java
       |
        --rest
          |
           --HelloResource.java
           --JaxRsActivator.java

Я назваў яго simpleRest , як паказана ніжэй. Усе архівы дакладна так, як паказана на малюнку:

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>

    4.0.0

    simpleRest
    simpleRest
    1.0
    war

    
        
            org.jboss.resteasy
            resteasy-jaxrs
            2.3.1.GA
            provided
        
    

    ${project.artifactId}
    
        
            maven-war-plugin
            2.1.1
            
                <!-- So maven doesn't require web.xml -->
                false
            
        
    


HelloResource.java

package rest;

import java.util.Date;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/hello")
public class HelloResource {
    @GET
    @Produces("text/plain")
    public String helloResource() {
        return "Hello! It's "+new Date();
    }
}

JaxRsActivator.java:

package rest;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/rest")
public class JaxRsActivator extends Application {

}

Гэта стварае simpleRest.war (праз МВН чысты пакет ). Вы можаце разгарнуць яго на свежаўсталяванай JBoss AS 7.1.1.Final (проста кінуць вайну файл у тэчку разгортвання) або Tomcat .

Пасля гэтага URL даступны, як і чакалася:

http://127.0.0.1:8080/simpleRest/rest/hello

Як хутка гэта?

12
дададзена
Чысты, просты, карысны! :)
дададзена аўтар Konstantin Yovkov, крыніца
Дзякуй вам, Гэта вялікае ўступленне :)
дададзена аўтар hyperlink, крыніца

Вось самы кароткі шлях я мог думаць, каб цалкам функцыянальны REST API патрабуе толькі Java, Gradle і тэкставы рэдактар , Стварыць два файла ў чыстым каталогу праекта наступным чынам:

<�Моцны> build.gradle

buildscript {
    repositories { mavenCentral() }
    dependencies {
        classpath 'org.gradle.api.plugins:gradle-tomcat-plugin:0.9.8'
    }
}
apply plugin: 'tomcat'

repositories { mavenCentral() }
dependencies {
    compile(
        'com.sun.jersey:jersey-core:1.17',
        'com.sun.jersey:jersey-server:1.17',
        'com.sun.jersey:jersey-servlet:1.17',
        'com.sun.jersey:jersey-json:1.17',
    )
    tomcat(
        'org.apache.tomcat:tomcat-catalina:7.0.40',
        'org.apache.tomcat:tomcat-coyote:7.0.40',
        'org.apache.tomcat:tomcat-jasper:7.0.40',
    )
}

<�Моцны> SRC/Асноўны/Java/орг/прыклад/TheApplication.java </моцны>

package org.example;

import com.sun.jersey.api.core.ClassNamesResourceConfig;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;
import javax.xml.bind.annotation.XmlRootElement;

@Path("/")
@ApplicationPath("/")
public class TheApplication extends ClassNamesResourceConfig {
    public TheApplication() { super(TheApplication.class); }

    static Foo foo = new Foo();

    @GET @Produces("application/json")
    public Foo getFoo() {
        return foo;
    }

    @POST @Consumes("application/json")
    public Response setFoo(Foo foo) {
        TheApplication.foo = foo;
        return Response.ok().entity("Stored it!").build();
    }

    @XmlRootElement
    static class Foo {
        private String message = "Hello World";
        public String getMessage() { return message; }
        public void setMessage(String message) { this.message = message; }
    }
}

Пасля таго, як гэтыя два файла ў месцы, Gradle tomcatRunWar будзе пачаць REST API, а таксама навігацыі па Http://Localhost: 8080/хутка вэб-сэрвіс/ у браўзэры атрымаеце вам «Hello World» у фармаце JSON паведамленне. Калі затым POST падобны JSON, як { «паведамленне»: «нешта іншае»} у той жа URL з чымсьці, як завіток або Poster паказаўшы тып зьместу" дадатак/JSON ", што новы аб'ект будзе захаваны і вернуты на паслядоўных запытах GET. Гэта проста прыклад вельмі голыя косці, але ахоплівае шмат асновы ў API JSON.

IDEs: You could further develop this easily with any common Java IDE. The Community Edition of IntelliJ IDEA and Eclipse are both popular and free IDEs. IDEA is far superior and the Ultimate Edition is 110% worth the cost of a personal license for a regular Java developer.

Technology Stack: JAX-RS is a leading way of writing REST APIs in Java. Pick any implementation. This example uses Jersey, the reference implementation. Spring may be overkill if you just need a simple API to expose already-written logic. It brings along more complexity than it sounds like you need. On the other hand, if you need a more flexible and capable framework that has more built-in support for virtually everything in the world, Spring may be just the ticket.

Server: Jetty or Tomcat supporting Servlet 3.0. There's not likely a reason for anything more or less.

5
дададзена
Дзякуй, як раз тое, што я шукаў!
дададзена аўтар hyperlink, крыніца

Ну я збіраюся кінуць IDE NetBeans пастаўляецца разам з GlassFish 3.x ў кольцы.

Спампаваць гэты пакет, ўсталюйце яго, і JAX-RS, які абслугоўвае да паслуг з'яўляецца майстрам правай кнопкі мышы прэч. Адна загрузка, адна ўстаноўка, цалкам ўсебаковым. Шмат дакументацыі, майстры і ўзоры.

Гэта сапраўды самы кароткі шлях, і гэта поўны набор інструментаў.

1
дададзена
Дзякуй, будзе праверыць гэта!
дададзена аўтар hyperlink, крыніца

Тое, што мы збіраемся ў маёй кампаніі з'яўляецца серверам Apache TomEE, выкарыстоўваючы JAX-RS, каб выставіць нашы API як REST сэрвісы. Лёгка наладзіць і лёгка працаваць.

0
дададзена

У мяне ёсць добры досвед працы з Джэрсі, які з'яўляецца эталоннай рэалізацыяй JAX-WS. Ён падтрымлівае JAX-WS анатацый, і гэта просты ў выкарыстанні.

0
дададзена

To speed up using the Jersey framework along the lines of https://stackoverflow.com/a/3891380/1497139

мы (BITPlan - мая кампанія) стварылі наступныя праекты з адкрытым зыходным кодам:

  1. https://github.com/BITPlan/com.bitplan.simplerest
  2. https://github.com/BITPlan/com.bitplan.simplerest-api
  3. https://github.com/BITPlan/com.bitplan.simplerest-example

Глядзіце прыклады кода ніжэй, як усталяваць:

  1. сервер
  2. частку змесціва прыкладання, якія будуць выкарыстоўвацца (Карыстальнік)
  3. некаторыя Рэсурсны агаляючы ўтрыманне (UserResource)
  4. тэставы прыклад, які паказвае, што ўсе працы

<�Моцны> Тэст для прыкладу </моцны>

package com.bitplan.simplerest.example;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

import com.bitplan.rest.RestServer;
import com.bitplan.rest.test.TestRestServer;

/**
 * test the example Server
 * @author wf
 *
 */
public class TestExampleServer extends TestRestServer {
  boolean debug=true;
  @Before
  public void initServer() throws Exception {
    startServer();
  }

  @Override
  public RestServer createServer() throws Exception {
    RestServer result = new ExampleServer();
    return result;
  }

  @Test
  public void testExampleServer() throws Exception {
    String userXml=getResponseString("application/xml", "/example/user");
    if (debug)
      System.out.println(userXml);
    String expected="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>[email protected]";
    assertEquals(expected,userXml);
    String userJson=getResponseString("application/json", "/example/user");
    if (debug)
      System.out.println(userJson);
    String expectedJson="{\"name\":\"Doe\",\"firstname\":\"John\",\"email\":\"[email protected]\"}";
    assertEquals(expectedJson,userJson);

  }

}

<�Моцны> ExampleServer

package com.bitplan.simplerest.example;

import com.bitplan.rest.RestServerImpl;

/**
 * an Example Server
 * @author wf
 *
 */
public class ExampleServer extends RestServerImpl { 

  /**
   * construct Example Server
   * setting defaults
   * @throws Exception 
   */
  public ExampleServer() throws Exception {
   //listen to whole network
    settings.setHost("0.0.0.0");
   //listen on given port
    settings.setPort(8111);
   //add the default path
    settings.setContextPath("/example");
   //add a static handler
    settings.addClassPathHandler("/", "/static/");
   //setup resources from the given packages
    String packages="com.bitplan.simplerest.example.resources;";
    settings.setPackages(packages);
   }

  /**
   * start Server
   * 
   * @param args
   * @throws Exception
   */
   public static void main(String[] args) throws Exception {
     ExampleServer rs=new ExampleServer();
     rs.settings.parseArguments(args);
     rs.startWebServer();
   }//main

}

<�Моцны> User

package com.bitplan.simplerest.example;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * example class
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
  public String name;
  public String firstname;
  public String email;

}

<�Моцны> Рэсурс карыстальніка

package com.bitplan.simplerest.example.resources;

import javax.ws.rs.GET;
import javax.ws.rs.Path;

import com.bitplan.simplerest.example.User;


@Path("/user")
public class UserResource {
  @GET
  public User getUser() {
    User user=new User();
    user.name="Doe";
    user.firstname="John";
    user.email="[email protected]";
    return user;
  }
}
0
дададзена

I would like to suggest the following approach to write REST-based Web Services. The follow "script" will guide you to create a very simple, and lightweight, web project using Kikaha and Undertow. The bellow approach is quite similar to the JAXRS-based example provided by Ryan Stewart, but with higher performance and low footprint due to Undertow's architecture (Undertow is really fast).

  1. Use the Kikaha's command line tool to create a stub project:

    kikaha project create 2.0 --name=my-app

  2. Although the above command brings you a couple REST API classes out-of-box, you can create your own entity class that represents your business rule as shown bellow.

<�Моцны> User.java

import lombok.*;

@Getter
@Setter
public class User {
    @NonNull Long id;
    @NonNull String name;
}
  1. Стварыце клас маршруту. Ён наладзіць метады, як REST канчатковымі кропкамі.

<�Моцны> UserResource.java

import lombok.*;
import kikaha.urouting.api.*;
import javax.inject.*;

@Singleton
@Path("user")
@Consumes( Mimes.JSON )
@Produces( Mimes.JSON )
public class UserResource {

    User savedUser;

    @POST
    public Response saveUser( User user ){
        if ( user.getName().isEmpty() )
            return DefaultResponses.preconditionFailed()
                    .entity("Name is blank");

        savedUser = user;
        return DefaultResponses.ok();
    }

    @GET
    public User getUser(){
        return savedUser;
    }
}
  1. Run your 5Mb project through the command line:

    kikaha run-app

Disclaimer: I was involved with Kikaha's development and have implanted many Undertow projects since its first version.

0
дададзена

Усе адказы распаўсюджваюцца на выкарыстанне Java лакальна з дапамогай лакальнага кантэйнера. Калі вы разглядаеце хмарныя асяроддзя, якія падтрымліваюць Java (і Java-падобныя пашырэння), вы маглі б быць у стане зрабіць гэта толькі з адным, як.

Платформа Raimme прапануе зручнае @Rest анатацыю. Усё, што вам трэба зрабіць, гэта ўсталяваць URL, і ваша служба REST будзе выстаўлены аўтаматычна:

@Rest(url = "customer/list")
@ResponseBody
public String getCustomer()
{
    return "[]";
}

This whole feature is described in more detail here: http://raimme.com/devcenter?questionId=1cg000000000g

0
дададзена

У якасці кансультанта, мне плацяць за вырашэнне праблем. Я выявіў, што Espresso Logic гэта самы хуткі спосаб для мяне, каб даставіць JSON/REST API. Яна працуе на падмурку Tomcat і можа быць лёгка разгорнутыя лакальна, на пругкім Beanstalk або Microsoft Azure. Яна злучаецца з усімі асноўнымі базамі дадзеных SQL і дае мне імгненны REST API для ўсіх табліц, уяўленняў, захоўваемых-працэдур, і адносін (якія выкарыстоўваюцца для пабудовы больш складаных рэсурсаў стылю дакумента). Яна мае як HTML Studio, і камандны радок Node.js для адміністравання. Лепшая асаблівасць з'яўляецца дэкларатыўным логіка (напрыклад, электронныя табліцы) для формулы, высноў і валідацыю. Логіка можа быць пашырана з выкарыстаннем як JavaScript і Java бібліятэкі падлучальных модуляў. Я праводжу час на напісанне рашэння JavaScript і дазваляючы Эспрэса рабіць цяжкую адпачывайце пагинацией, аптымістычнай блакавання, аптымізацыя запытаў SQL і логікі транзакцый за некалькімі сталамі. Поўнае раскрыццё - Я ведаў іх на працягу 25 гадоў, і гэта лепшая гульня якое змяняецца тэхналогіі я бачыў. Праверце гэта: www.espressologic.com

0
дададзена