jax-ws和jax-rs
用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服务器的一种非常简单的方法。
jax-ws和jax-rs