zoukankan      html  css  js  c++  java
  • Rest之路 -- 从第二个Rest application里面分析 Rest 方法

    引言

    在此之前,我们实现了第一个Rest application,通过分析她,我们了解了 Rest 程序的基本要素;这里,我们将会对第一个 Rest application 的功能进行扩充(实现 CRUD)。为了简化流程,我们依然采用文件的方式来模拟数据库操作。

    第二个 Rest application

    User

    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 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

    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

    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);
       }
    
       @PUT
       @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;
       }
    
       @POST
       @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>";
       }
    }
    

    WebServiceTester(Write test client ourselves)

    Jersey允许我们自己实现测试类(Web Service Client)

    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)
             .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: 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)
             .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: 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里面,选中 WebServiceTester, 右键 -> run as Java application, 我们会在 console 里面看到一下输出

    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
    

    Rest verbs

    现在,我们再来分析一下 Rest verbs, 通过一下的表格我们能够更好地理解他们...

    S.N.HTTP Method, URI and Operation
    1 GET
    http://localhost:8080/UserManagement/rest/UserService/users
    获取 users 列表
    (只读的)
    2 GET
    http://localhost:8080/UserManagement/rest/UserService/users/1
    获取 id=1 的user
    (只读的)
    3 PUT
    http://localhost:8080/UserManagement/rest/UserService/users/2
    插入 id =2 的 user
    (幂等的)
    4 POST
    http://localhost:8080/UserManagement/rest/UserService/users/2
    更新 id=2 的 user
    (N/A)
    5 DELETE
    http://localhost:8080/UserManagement/rest/UserService/users/1
    删除 id=1 的 user
    (幂等的)
    6 OPTIONS
    http://localhost:8080/UserManagement/rest/UserService/users
    列出 service 上面的所有 operations
    (Read Only)
    7 HEAD
    http://localhost:8080/UserManagement/rest/UserService/users
    返回 HTTP HEAD
    (Read Only)

    注: 从URI 中, 我们不容易看出来究竟要执行 Rest service 的那个operation,operation需要体现以Class.Method的形式体现出来。

  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/atuotuo/p/6287218.html
Copyright © 2011-2022 走看看