RESTful - Web 服务方法

  • 简述

    到目前为止,我们已经讨论过,RESTful web服务大量使用HTTP动词来确定要在指定资源上执行的操作。下表列出了HTTP Verbs的常见用法示例。
    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的用户
    操作类型 不幂等
    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 的用户
    操作类型 幂等的
    HTTP 方法 OPTIONS
    URI http://localhost:8080/UserManagement/rest/UserService/users
    操作 List the supported operations in web service
    操作类型 只读
    HTTP 方法 HEAD
    URI http://localhost:8080/UserManagement/rest/UserService/users
    操作 Returns only HTTP Header, no Body
    操作类型 只读
    以下是需要考虑的要点:
    • GET操作是只读的,是安全的。
    • PUT和DELETE操作是幂等的,这意味着无论调用多少次,它们的结果都是相同的。
    • PUT和POST操作几乎相同,只是结果不同,PUT操作是幂等的,POST操作会导致不同的结果。
  • 例子

    让我们更新在 RESTful Web 服务中创建的示例,创建可以执行 CRUD(创建、读取、更新、删除)操作的Web 服务的第一个应用程序教程。为简单起见,我们使用文件 I/O 来替换数据库操作。
    更新 UserService.java, User.java,UserDao.java com.jc2182 包下的文件。
    User.java
    
    
    package com.jc2182;
    
    
    
    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.jc2182;
    
    
    
    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<User> getAllUsers(){
    
          List<User> userList = null;
    
          try {
    
             File file = new File("Users.dat");
    
             if (!file.exists()) {
    
                User user = new User(1, "Mahesh", "Teacher");
    
                userList = new ArrayList<User>();
    
                userList.add(user);
    
                saveUserList(userList);    
    
             }
    
             else{
    
                FileInputStream fis = new FileInputStream(file);
    
                ObjectInputStream ois = new ObjectInputStream(fis);
    
                userList = (List<User>) ois.readObject();
    
                ois.close();
    
             }
    
          } catch (IOException e) {
    
             e.printStackTrace();
    
          } catch (ClassNotFoundException e) {
    
             e.printStackTrace();
    
          }     
    
          return userList;
    
       }
    
    
    
       public User getUser(int id){
    
          List<User> users = getAllUsers();
    
    
    
          for(User user: users){
    
             if(user.getId() == id){
    
                return user;
    
             }
    
          }
    
          return null;
    
       }
    
    
    
       public int addUser(User pUser){
    
          List<User> 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<User> 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<User> 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<User> 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.jc2182;
    
    
    
    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="<result>success</result>";
    
       private static final String FAILURE_RESULT="<result>failure</result>";
    
    
    
    
    
       @GET
    
       @Path("/users")
    
       @Produces(MediaType.APPLICATION_XML)
    
       public List<User> 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 "<operations>GET, PUT, POST, DELETE</operations>";
    
       }
    
    }
    
    
    现在使用 Eclipse,将您的应用程序导出为一个 war 文件并在 tomcat 中部署它。要使用 Eclipse 创建 WAR 文件,请按照选项File -> export -> Web > War File最后选择项目 UserManagement 和目标文件夹。要在 Tomcat 中部署 war 文件,请将 UserManagement.war 放在Tomcat Installation Directory > webapps 目录并启动Tomcat。
  • 测试 Web 服务

    Jersey 提供 API 来创建 Web 服务客户端来测试 Web 服务。我们创建了一个示例测试类WebServiceTester.java 在同一个项目中的 com.jc2182 包下。
    WebServiceTester.java
    
    
    package com.jc2182;
    
    
    
    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="<result>success</result>";
    
       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<User>> list = new GenericType<List<User>>() {};
    
          List<User> 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 运行测试器。右键单击文件,然后按照选项Run as -> Java Application. 您将在 Eclipse 控制台中看到以下结果 -
    
    
    Test case name: testGetAllUsers, Result: pass
    
    Test case name: testGetUser, Result: pass
    
    Test case name: testUpdateUser, Result: pass
    
    Test case name: testAddUser, Result: pass
    
    Test case name: testDeleteUser, Result: pass