Создать 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-клиент, который можно найти в меню инструментов.
Когда вы запустите клиент REST, вы получите этот ответ:
Это действительно простой способ проверить сервер RESTful.
Ссылка: | Создание веб-служб и сервера отдыха с JAX-RS и Jetty от нашего партнера по JCG Даниэля Шая в блоге Rational Java . |