正如我们到目前为止所讨论的那样,RESTful Web服务大量使用HTTP动词来确定要对指定资源执行的操作.下表列出了HTTP动词的常用例子.
HTTP方法 | GET |
---|---|
URI | http://localhost:8080/UserManagement/rest/UserService/users |
操作 | 获取用户列表 |
操作类型 | 只读 |
HTTP方法 | GET |
---|---|
URI | http://localhost :8080/UserManagement/rest/UserService/users/1 |
操作 | 获取Id 1的用户 |
操作类型 | 读取只有 |
HTTP方法 | POST |
---|---|
URI | http://localhost:8080/UserManagement/rest/UserService/users/2 |
操作 | 使用Id 2插入用户 |
操作类型 | Non-Idempotent |
HTTP方法 | PUT |
---|---|
URI | http://localhost:8080/UserManagement/rest/UserService/users/2 |
操作 | 用Id 2更新用户 |
操作类型 | N/A |
HTTP方法 | DELETE |
---|---|
URI | http://localhost:8080/UserManagement/rest/UserService/users/1 |
操作 | 删除用户ID 1 |
操作类型 | Idempotent |
HTTP方法 | OPTIONS |
---|---|
URI | http://localhost:8080/UserManagement/rest/UserService/users |
操作 | 列出支持的操作网络服务 |
操作类型 | 只读 |
HTTP方法 | HEAD |
---|---|
URI | http://localhost: 8080/UserManagement/rest/UserService/users |
操作 | 仅返回HTTP标题,没有正文 |
操作类型 | 只读 |
以下是要考虑的要点:
GET操作是只读的并且是安全的.
PUT和DELETE操作是幂等的,意味着它们的结果总是相同的无论调用这些操作多少次.
PUT和POST操作几乎相同,只是在PUT操作是幂等的和POST操作的结果中存在差异会导致不同的结果.
示例
让我们更新在 RESTful Web服务 - 第一个应用程序教程,用于创建可以执行CRUD(创建,读取,更新,删除)操作的Web服务.为简单起见,我们使用文件I/O来替换数据库操作.
更新 UserService.java , User.java ,com.it1352包下的 UserDao.java 文件.
User.java
package com.it1352; import java.io.Serializable;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name = "user")public class User implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private String profession; public User(){} public User(int id, String name, String profession){ this.id = id; this.name = name; this.profession = profession; } public int getId() { return id; } @XmlElement public void setId(int id) { this.id = id; } public String getName() { return name; } @XmlElement public void setName(String name) { this.name = name; } public String getProfession() { return profession; } @XmlElement public void setProfession(String profession) { this.profession = profession; } @Override public boolean equals(Object object){ if(object == null){ return false; }else if(!(object instanceof User)){ return false; }else { User user = (User)object; if(id == user.getId() && name.equals(user.getName()) && profession.equals(user.getProfession()) ){ return true; } } return false; }}
UserDao.java
package com.it1352; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.ArrayList;import java.util.List;public class UserDao { public ListgetAllUsers(){ List userList = null; try { File file = new File("Users.dat"); if (!file.exists()) { User user = new User(1, "Mahesh", "Teacher"); userList = new ArrayList (); userList.add(user); saveUserList(userList); } else{ FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); userList = (List ) ois.readObject(); ois.close(); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return userList; } public User getUser(int id){ List users = getAllUsers(); for(User user: users){ if(user.getId() == id){ return user; } } return null; } public int addUser(User pUser){ List userList = getAllUsers(); boolean userExists = false; for(User user: userList){ if(user.getId() == pUser.getId()){ userExists = true; break; } } if(!userExists){ userList.add(pUser); saveUserList(userList); return 1; } return 0; } public int updateUser(User pUser){ List userList = getAllUsers(); for(User user: userList){ if(user.getId() == pUser.getId()){ int index = userList.indexOf(user); userList.set(index, pUser); saveUserList(userList); return 1; } } return 0; } public int deleteUser(int id){ List userList = getAllUsers(); for(User user: userList){ if(user.getId() == id){ int index = userList.indexOf(user); userList.remove(index); saveUserList(userList); return 1; } } return 0; } private void saveUserList(List userList){ try { File file = new File("Users.dat"); FileOutputStream fos; fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(userList); oos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
UserService.java
package com.it1352; import java.io.IOException;import java.util.List;import javax.servlet.http.HttpServletResponse;import javax.ws.rs.Consumes;import javax.ws.rs.DELETE;import javax.ws.rs.FormParam;import javax.ws.rs.GET;import javax.ws.rs.OPTIONS;import javax.ws.rs.POST;import javax.ws.rs.PUT;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.Produces;import javax.ws.rs.core.Context;import javax.ws.rs.core.MediaType;@Path("/UserService")public class UserService { UserDao userDao = new UserDao(); private static final String SUCCESS_RESULT="success "; private static final String FAILURE_RESULT="failure "; @GET @Path("/users") @Produces(MediaType.APPLICATION_XML) public ListgetUsers(){ return userDao.getAllUsers(); } @GET @Path("/users/{userid}") @Produces(MediaType.APPLICATION_XML) public User getUser(@PathParam("userid") int userid){ return userDao.getUser(userid); } @POST @Path("/users") @Produces(MediaType.APPLICATION_XML) @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public String createUser(@FormParam("id") int id, @FormParam("name") String name, @FormParam("profession") String profession, @Context HttpServletResponse servletResponse) throws IOException{ User user = new User(id, name, profession); int result = userDao.addUser(user); if(result == 1){ return SUCCESS_RESULT; } return FAILURE_RESULT; } @PUT @Path("/users") @Produces(MediaType.APPLICATION_XML) @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public String updateUser(@FormParam("id") int id, @FormParam("name") String name, @FormParam("profession") String profession, @Context HttpServletResponse servletResponse) throws IOException{ User user = new User(id, name, profession); int result = userDao.updateUser(user); if(result == 1){ return SUCCESS_RESULT; } return FAILURE_RESULT; } @DELETE @Path("/users/{userid}") @Produces(MediaType.APPLICATION_XML) public String deleteUser(@PathParam("userid") int userid){ int result = userDao.deleteUser(userid); if(result == 1){ return SUCCESS_RESULT; } return FAILURE_RESULT; } @OPTIONS @Path("/users") @Produces(MediaType.APPLICATION_XML) public String getSupportedOperations(){ return " GET, PUT, POST, DELETE "; }}
现在使用Eclipse,将应用程序导出为war文件并在tomcat中部署它.要使用eclipse创建WAR文件,请按照选项文件 - >出口 - >网络>战争文件,最后选择项目UserManagement和目标文件夹.要在Tomcat中部署war文件,请将UserManagement.war放在 Tomcat安装目录>中. webapps目录并启动Tomcat.
测试Web服务
Jersey提供API来创建Web服务客户端来测试Web服务.我们在同一个项目的com.it1352包下创建了一个示例测试类 WebServiceTester.java .
WebServiceTester.java
package com.it1352; import java.util.List;import javax.ws.rs.client.Client;import javax.ws.rs.client.ClientBuilder;import javax.ws.rs.client.Entity;import javax.ws.rs.core.Form;import javax.ws.rs.core.GenericType;import javax.ws.rs.core.MediaType;public class WebServiceTester { private Client client; private String REST_SERVICE_URL = "http://localhost:8080/UserManagement/rest/UserService/users"; private static final String SUCCESS_RESULT="success "; private static final String PASS = "pass"; private static final String FAIL = "fail"; private void init(){ this.client = ClientBuilder.newClient(); } public static void main(String[] args){ WebServiceTester tester = new WebServiceTester(); //initialize the tester tester.init(); //test get all users Web Service Method tester.testGetAllUsers(); //test get user Web Service Method tester.testGetUser(); //test update user Web Service Method tester.testUpdateUser(); //test add user Web Service Method tester.testAddUser(); //test delete user Web Service Method tester.testDeleteUser(); } //Test: Get list of all users //Test: Check if list is not empty private void testGetAllUsers(){ GenericType> list = new GenericType
>() {}; List
users = client .target(REST_SERVICE_URL) .request(MediaType.APPLICATION_XML) .get(list); String result = PASS; if(users.isEmpty()){ result = FAIL; } System.out.println("Test case name: testGetAllUsers, Result: " + result ); } //Test: Get User of id 1 //Test: Check if user is same as sample user private void testGetUser(){ User sampleUser = new User(); sampleUser.setId(1); User user = client .target(REST_SERVICE_URL) .path("/{userid}") .resolveTemplate("userid", 1) .request(MediaType.APPLICATION_XML) .get(User.class); String result = FAIL; if(sampleUser != null && sampleUser.getId() == user.getId()){ result = PASS; } System.out.println("Test case name: testGetUser, Result: " + result ); } //Test: Update User of id 1 //Test: Check if result is success XML. private void testUpdateUser(){ Form form = new Form(); form.param("id", "1"); form.param("name", "suresh"); form.param("profession", "clerk"); String callResult = client .target(REST_SERVICE_URL) .request(MediaType.APPLICATION_XML) .put(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE), String.class); String result = PASS; if(!SUCCESS_RESULT.equals(callResult)){ result = FAIL; } System.out.println("Test case name: testUpdateUser, Result: " + result ); } //Test: Add User of id 2 //Test: Check if result is success XML. private void testAddUser(){ Form form = new Form(); form.param("id", "2"); form.param("name", "naresh"); form.param("profession", "clerk"); String callResult = client .target(REST_SERVICE_URL) .request(MediaType.APPLICATION_XML) .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE), String.class); String result = PASS; if(!SUCCESS_RESULT.equals(callResult)){ result = FAIL; } System.out.println("Test case name: testAddUser, Result: " + result ); } //Test: Delete User of id 2 //Test: Check if result is success XML. private void testDeleteUser(){ String callResult = client .target(REST_SERVICE_URL) .path("/{userid}") .resolveTemplate("userid", 2) .request(MediaType.APPLICATION_XML) .delete(String.class); String result = PASS; if(!SUCCESS_RESULT.equals(callResult)){ result = FAIL; } System.out.println("Test case name: testDeleteUser, Result: " + result ); }}
现在使用Eclipse运行测试程序.右键单击该文件,然后按运行方式 - >选项. Java应用程序.您将在Eclipse控制台中看到以下结果:
Test case name: testGetAllUsers, Result: passTest case name: testGetUser, Result: passTest case name: testUpdateUser, Result: passTest case name: testAddUser, Result: passTest case name: testDeleteUser, Result: pass