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的形式体现出来。

  • 相关阅读:
    隔壁小孩都要知道的Drupal配置
    Cobaltstrike、armitage联动
    YxCMS 1.4.7 最新版漏洞分析
    业务逻辑漏洞探索之暴力破解
    刺透内网的HTTP代理
    pwn入门之栈溢出练习
    史上最完整的MySQL注入
    ISG 2018 Web Writeup
    3-4 计算长方形的周长和面积
    【Lucene4.8教程之二】索引
  • 原文地址:https://www.cnblogs.com/atuotuo/p/6287218.html
Copyright © 2011-2022 走看看