使用JAX-RS和Jetty创建Web服务和Rest Server
用Java创建WebService非常容易。 将其添加到ServletContainer并将其部署到嵌入式WebServer仅需要几行代码。
让我们创建一个具有两个函数的简单计算器,作为WebService
的示例。 计算器将计算任何数量的squareRoot和平方。 它将返回一个简单的JSON响应,其中包含动作名称,输入和输出。
在我们开始之前,这是Gradle配置,您将需要:
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' }
这是计算器的代码:
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
注释确定该请求的URI和@Produces
注释确定如何响应将被返回。 在我们的例子中,我们选择JSON,所有这些转换都可以无缝处理。
为了部署我们的WebService,我们需要一个要使用Jersey的ServletContainer和一个我们可以将要使用Jetty的容器放入其中的WebServer。
这是RestServer的代码:
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:// localhost:8080 / calculator / squareRoot?input = 16
从IntelliJ运行查询的一种非常不错的方法是使用内置的REST Client,可以在工具菜单下找到它。
当您运行REST客户端时,您将收到以下响应:
这是测试RESTful服务器的一种非常简单的方法。