开发手册 欢迎您!
软件开发者资料库

RESTful Web服务 - 方法

适用于初学者的RESTful Web服务教程 - 从简介,环境设置,资源,消息,寻址,方法,无状态,缓存,安全性,Java(JAX-RS)开始,以简单易懂的步骤学习RESTful Web服务

正如我们到目前为止所讨论的那样,RESTful Web服务大量使用HTTP动词来确定要对指定资源执行的操作.下表列出了HTTP动词的常用例子.

HTTP方法GET
URIhttp://localhost:8080/UserManagement/rest/UserService/users
操作获取用户列表
操作类型只读
HTTP方法GET
URIhttp://localhost :8080/UserManagement/rest/UserService/users/1
操作获取Id 1的用户
操作类型读取只有
HTTP方法POST
URIhttp://localhost:8080/UserManagement/rest/UserService/users/2
操作使用Id 2插入用户
操作类型Non-Idempotent
HTTP方法PUT
URIhttp://localhost:8080/UserManagement/rest/UserService/users/2
操作用Id 2更新用户
操作类型N/A
HTTP方法DELETE
URIhttp://localhost:8080/UserManagement/rest/UserService/users/1
操作删除用户ID 1
操作类型Idempotent
HTTP方法OPTIONS
URIhttp://localhost:8080/UserManagement/rest/UserService/users
操作列出支持的操作网络服务
操作类型只读
HTTP方法HEAD
URIhttp://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 List getAllUsers(){      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 List getUsers(){      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