Eclipse用REST实现Web Service
本文基于Eclipse JEE用REST实现Web Service,所用服务器为Tomcat 9。
- 1. 构建Web Service的服务器端
- 2. 构建客户端测试Web Service
本文以四则运算器Calculator的Service为例。
1. 构建Web Service的服务器端
- 1)创建一个名为“CalculatorREST”的Dynamic Web Project
点击Next, 出现如下窗口,然后输入项目名称“CalculatorREST”并指定项目路径:
这里不要直接点击Finish,而要点击Next,因为要再最后一步勾选“生成web.xml文件”的选项,这个文件后面会用到。
点击Next,然后勾选“Generate web.xml delpoyment descriptor”:
点击Finish, 服务器端的项目创建完成。
- 2)下载并导入项目所需要的jar包
由于本项目使用Jersey框架,所以需要下载Jersey所需要的jar包。
Jersey JAX-RS 2.1 RI bundle下载地址:https://jersey.github.io/download.html (点击里面蓝色的Jersey JAX-RS 2.1 RI bundle就可以进行下载)。
将下载下来的文件解压,文件结构如下:
其中api,ext,lib这三个文件夹中分别包含很多jar包。将这些jar包全部拷贝到工程中WebContent/WEB-INF/lib目录中。不要直接将文件夹拷入,而是将这三个文件夹中的jar包全部拷入。也就是说,最后WebContent/WEB-INF/lib目录中不是包含“api, ext,lib”这三个文件夹,而是直接包含全部的jar包。否则会出错。 WebContent/WEB-INF/lib中的内容如下:
回到Eclipse中,在项目名上右键->Refresh,然后再次右键->Build Path->Configure Build Path->Libraries->Add JARs,将刚才WebContent/WEB-INF/lib中的jar包添加进去:
- 3)编写Web Service所要提供的功能的代码
在src中创建一个名为“mypackage ”的包,并在包中创建一个名为“Calculator”的类,Calculator.Java中的代码如下:
//Calculator.java
package mypackage;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/CalculationService")
public class Calculator {
@GET
@Path("/add")
@Produces(MediaType.TEXT_PLAIN)
public double Add(@QueryParam("x") double x,@QueryParam("y") double y) {
return x+y;
}
@GET
@Path("/sub")
@Produces(MediaType.TEXT_PLAIN)
public double Sub(@QueryParam("x") double x,@QueryParam("y") double y) {
return x-y;
}
@GET
@Path("/mul")
@Produces(MediaType.TEXT_PLAIN)
public double Mul(@QueryParam("x") double x,@QueryParam("y") double y) {
return x*y;
}
@GET
@Path("/div")
@Produces(MediaType.TEXT_PLAIN)
public double Div(@QueryParam("x") double x,@QueryParam("y") double y) {
return x/y;
}
}
写完后记得“ctrl+s”保存一下,否则后面会出错。
- 4)修改web.xml文件,增加jersey信息
修改后的web.xml文件代码如下:
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>CalculatorREST</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Jersey RESTful Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>mypackage</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey RESTful Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
写完后记得“ctrl+s”保存一下,否则后面会出错。
这样Web Service的服务器端就搭建好了,此时的目录结构为:
- 5)在浏览器中测试
在项目名上右键->Run As->Run on Server,启动Tomcat服务器,然后在浏览器中输入:http://localhost:8080/CalculatorREST/rest/CalculationService/add?x=35.4&y=27.9,得到如下结果:
计算35.4+27.9就可得到结果63.3。
(如果显示404 Not Found,且确定自己的代码完全按照上述步骤写的,点击Project->Clean,然后再重新Run一下试试。)
2. 构建客户端测试Web Service
客户端测试过程中服务器端的Tomcat要保持全程开启状态!!!!!!
- 1)创建一个名为“TestCalculatorREST”的Java Project
点击Next, 出现如下窗口,然后输入项目名称“TestCalculatorREST”并指定项目路径:
点击Next:
点击Finish, 服务器端的项目创建完成。
- 2)写main函数进行测试
本客户端给出两种方式的代码进行测试。
在src中创建一个名为“mypackage ”的包,并在包中分别创建一个名为“Main1”的类和“Main2”的类,这两个类中的内容如下:
//Main1.java
package mypackage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
public class Main1 {
public static void main(String[] args) {
System.out.println("REST方式的Calculator Web Service:");
try {
Scanner input = new Scanner(System.in);
System.out.println("请输入运算符(+,-,*,/): ");
String operator = input.nextLine();
System.out.println("x = ");
double x = input.nextDouble();
System.out.println("y = ");
double y = input.nextDouble();
String result = "";
URL url = null;
if (operator.equals("+"))
url = new URL("http://localhost:8080/CalculatorREST/rest/CalculationService/add?x=" + x + "&y=" + y);
if (operator.equals("-"))
url = new URL("http://localhost:8080/CalculatorREST/rest/CalculationService/sub?x=" + x + "&y=" + y);
if (operator.equals("*"))
url = new URL("http://localhost:8080/CalculatorREST/rest/CalculationService/mul?x=" + x + "&y=" + y);
if (operator.equals("/"))
url = new URL("http://localhost:8080/CalculatorREST/rest/CalculationService/div?x=" + x + "&y=" + y);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "text/plain");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
System.out.println("Output from REST Server ......");
while ((result = br.readLine()) != null) {
System.out.println("运算结果 = "+ result);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//Main2.java
package mypackage;
import java.util.Scanner;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import org.glassfish.jersey.client.ClientConfig;
public class Main2 {
public static void main(String[] args) {
System.out.println("REST方式的Calculator Web Service:");
Scanner input = new Scanner(System.in);
System.out.println("请输入运算符(+,-,*,/): ");
String operator = input.nextLine();
System.out.println("x = ");
double x = input.nextDouble();
System.out.println("y = ");
double y = input.nextDouble();
String result = "";
ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target = client.target("http://localhost:8080/CalculatorREST");
String funcPath = "";
if (operator.equals("+"))
funcPath = "add";
if (operator.equals("-"))
funcPath = "sub";
if (operator.equals("*"))
funcPath = "mul";
if (operator.equals("/"))
funcPath = "div";
result = target.path("rest").path("CalculationService").path(funcPath).queryParam("x", x).queryParam("y", y).request().accept(MediaType.TEXT_PLAIN).get(String.class);
System.out.println("Output from REST Server ......");
System.out.println("运算结果 = "+ result);
}
}
对于第二种方式,在“TestCalculatorREST”的项目根目录下创建一个文件夹叫“lib”,然后将刚才拷入CalculationREST/WebContent/WEB-INF/lib中的jar包再全部拷贝到这个文件夹下。回到Eclipse中,在项目名上右键->Refresh,然后再次右键->Build Path->Configure Build Path->Libraries->Add JARs,将所有的jar包添加进去。过程和服务器端添加jar包的过程完全一样。
在Main1.java上或者Main2.java上右键->Run as->Java Application,用户分别输入运算符,x和y的值,就可得出计算结果(两种方式的运行结果是一模一样的):