Статьи

Создание веб-сервисов и сервера отдыха с JAX-RS и Jetty

Создать WebService в Java очень просто. Чтобы добавить его в ServletContainer и развернуть его на встроенном WebServer, нужно всего лишь несколько строк кода.

Давайте создадим простой калькулятор с парой функций в качестве примера WebService . Калькулятор будет вычислять squareRoot и квадрат любого числа. Он вернет простой JSON-ответ с именем действия, входом и выходом.

Прежде чем мы начнем, вам понадобится конфигурация Gradle:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
apply plugin: 'java'
 
version = '1.0'
 
repositories {
    mavenCentral()
}
 
dependencies {
    compile group: 'org.glassfish.jersey.core', name: 'jersey-server', version: '2.7'
    compile group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet-core', version: '2.7'
    compile group: 'org.glassfish.jersey.containers', name: 'jersey-container-jetty-http', version: '2.7'
    compile group: 'org.glassfish.jersey.media', name: 'jersey-media-moxy', version: '2.7'
    compile group: 'org.eclipse.jetty.aggregate', name: 'jetty-all', version: '9.3.0.M1'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

Это код для калькулятора:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package example;
 
 
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
 
@Path("calculator")
public class Calculator {
    @GET
    @Path("squareRoot")
    @Produces(MediaType.APPLICATION_JSON)
    public Result squareRoot(@QueryParam("input") double input){
        Result result = new Result("Square Root");
        result.setInput(input);
        result.setOutput(Math.sqrt(result.getInput()));
        return result;
    }
 
    @GET
    @Path("square")
    @Produces(MediaType.APPLICATION_JSON)
    public Result square(@QueryParam("input") double input){
        Result result = new Result("Square");
        result.setInput(input);
        result.setOutput(result.getInput()*result.getInput());
        return result;
    }
 
    static class Result{
        double input;
        double output;
        String action;
 
        public Result(){}
 
        public Result(String action) {
            this.action = action;
        }
 
        public String getAction() {
            return action;
        }
 
        public void setAction(String action) {
            this.action = action;
        }
 
        public double getInput() {
            return input;
        }
 
        public void setInput(double input) {
            this.input = input;
        }
 
        public double getOutput() {
            return output;
        }
 
        public void setOutput(double output) {
            this.output = output;
        }
    }
}

Аннотации определяют тип действия REST, которое будет применено к методу @GET , @PUT и т. @Path Аннотация @Path определяет URI запроса, а аннотация @Produces определяет, как ответ будет возвращен. В нашем случае мы выбираем JSON, преобразование которого выполняется без проблем.

Для развертывания нашего WebService нам нужен ServletContainer, для которого мы будем использовать Jersey, и WebServer, в который мы можем поместить контейнер, для которого мы будем использовать Jetty .

Это код для RestServer:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package example;
 
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
 
 
public class RestServer {
    public static void main(String[] args) throws Exception {
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
 
        Server jettyServer = new Server(8080);
        jettyServer.setHandler(context);
 
        ServletHolder jerseyServlet = context.addServlet(
                org.glassfish.jersey.servlet.ServletContainer.class, "/*");
        jerseyServlet.setInitOrder(0);
 
        jerseyServlet.setInitParameter(
                "jersey.config.server.provider.classnames",
                Calculator.class.getCanonicalName());
 
        try {
            jettyServer.start();
            jettyServer.join();
        } finally {
            jettyServer.destroy();
        }
    }
}

Запустив RestServer, вы сможете протестировать его с этим URL.

  • HTTP: // локальный: 8080 / калькулятор / SquareRoot вход = 16

Действительно хороший способ выполнять запросы из IntelliJ — это использовать встроенный REST-клиент, который можно найти в меню инструментов.

Снимок экрана 2015-03-09 в 15.40.00

Когда вы запустите клиент REST, вы получите этот ответ:

Снимок экрана 2015-03-09 в 15.41.33

Это действительно простой способ проверить сервер RESTful.