zoukankan      html  css  js  c++  java
  • 【Restful】三分钟彻底了解Restful最佳实践

    转载自:http://blog.csdn.net/chenxiaochan/article/details/73716617

    REST是英文representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP,URI,XML,JSON,HTML等广泛流行的标准和协议;轻量级,跨平台,跨语言的架构设计;它是一种设计风格,不是一种标准,是一种思想

    Rest架构的主要原则

         网络上的所有事物都被抽象为资源

        每个资源都有一个唯一的资源标识符

        同一个资源具有多种表现形式(xml,json等)

        对资源的各种操作不会改变资源标识符

        所有的操作都是无状态的

        符合REST原则的架构方式即可称为RESTful

    什么是Restful:

            对应的中文是rest式的;Restful web service是一种常见的rest的应用,是遵守了rest风格的web服务;rest式的web服务是一种ROA(The Resource-Oriented Architecture)(面向资源的架构).

    为什么会出现Restful

    在Restful之前的操作:
    http://127.0.0.1/user/query/1 GET  根据用户id查询用户数据
    http://127.0.0.1/user/save POST 新增用户
    http://127.0.0.1/user/update POST 修改用户信息
    http://127.0.0.1/user/delete GET/POST 删除用户信息

    RESTful用法:
    http://127.0.0.1/user/1 GET  根据用户id查询用户数据
    http://127.0.0.1/user  POST 新增用户
    http://127.0.0.1/user  PUT 修改用户信息
    http://127.0.0.1/user  DELETE 删除用户信息

    之前的操作是没有问题的,大神认为是有问题的,有什么问题呢?你每次请求的接口或者地址,都在做描述,例如查询的时候用了query,新增的时候用了save,其实完全没有这个必要,我使用了get请求,就是查询.使用post请求,就是新增的请求,我的意图很明显,完全没有必要做描述,这就是为什么有了restful.

    如何使用:

    SpringMVC实现restful服务:

    SpringMVC原生态的支持了REST风格的架构设计

    所涉及到的注解:

    --@RequestMapping

    ---@PathVariable

    ---@ResponseBody

    [java] view plain copy
     
    1. package cn.itcast.mybatis.controller;  
    2.   
    3. import org.springframework.beans.factory.annotation.Autowired;  
    4. import org.springframework.http.HttpStatus;  
    5. import org.springframework.http.ResponseEntity;  
    6. import org.springframework.stereotype.Controller;  
    7. import org.springframework.web.bind.annotation.PathVariable;  
    8. import org.springframework.web.bind.annotation.RequestMapping;  
    9. import org.springframework.web.bind.annotation.RequestMethod;  
    10. import org.springframework.web.bind.annotation.RequestParam;  
    11. import org.springframework.web.bind.annotation.ResponseBody;  
    12.   
    13. import cn.itcast.mybatis.pojo.User;  
    14. import cn.itcast.mybatis.service.NewUserService;  
    15.   
    16. @RequestMapping("restful/user")  
    17. @Controller  
    18. public class RestUserController {  
    19.   
    20.     @Autowired  
    21.     private NewUserService newUserService;  
    22.   
    23.     /** 
    24.      * 根据用户id查询用户数据 
    25.      *  
    26.      * @param id 
    27.      * @return 
    28.      */  
    29.     @RequestMapping(value = "{id}", method = RequestMethod.GET)  
    30.     @ResponseBody  
    31.     public ResponseEntity<User> queryUserById(@PathVariable("id") Long id) {  
    32.         try {  
    33.             User user = this.newUserService.queryUserById(id);  
    34.             if (null == user) {  
    35.                 // 资源不存在,响应404  
    36.                 return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);  
    37.             }  
    38.             // 200  
    39.             // return ResponseEntity.status(HttpStatus.OK).body(user);  
    40.             return ResponseEntity.ok(user);  
    41.         } catch (Exception e) {  
    42.             e.printStackTrace();  
    43.         }  
    44.         // 500  
    45.         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);  
    46.     }  
    47.   
    48.     /** 
    49.      * 新增用户 
    50.      *  
    51.      * @param user 
    52.      * @return 
    53.      */  
    54.     @RequestMapping(method = RequestMethod.POST)  
    55.     public ResponseEntity<Void> saveUser(User user) {  
    56.         try {  
    57.             this.newUserService.saveUser(user);  
    58.             return ResponseEntity.status(HttpStatus.CREATED).build();  
    59.         } catch (Exception e) {  
    60.             // TODO Auto-generated catch block  
    61.             e.printStackTrace();  
    62.         }  
    63.         // 500  
    64.         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);  
    65.     }  
    66.   
    67.     /** 
    68.      * 更新用户资源 
    69.      *  
    70.      * @param user 
    71.      * @return 
    72.      */  
    73.     @RequestMapping(method = RequestMethod.PUT)  
    74.     public ResponseEntity<Void> updateUser(User user) {  
    75.         try {  
    76.             this.newUserService.updateUser(user);  
    77.             return ResponseEntity.status(HttpStatus.NO_CONTENT).build();  
    78.         } catch (Exception e) {  
    79.             e.printStackTrace();  
    80.         }  
    81.         // 500  
    82.         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);  
    83.     }  
    84.   
    85.     /** 
    86.      * 删除用户资源 
    87.      *  
    88.      * @param user 
    89.      * @return 
    90.      */  
    91.     @RequestMapping(method = RequestMethod.DELETE)  
    92.     public ResponseEntity<Void> deleteUser(@RequestParam(value = "id", defaultValue = "0") Long id) {  
    93.         try {  
    94.             if (id.intValue() == 0) {  
    95.                 // 请求参数有误  
    96.                 return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();  
    97.             }  
    98.             this.newUserService.deleteUserById(id);  
    99.             // 204  
    100.             return ResponseEntity.status(HttpStatus.NO_CONTENT).build();  
    101.         } catch (Exception e) {  
    102.             e.printStackTrace();  
    103.         }  
    104.         // 500  
    105.         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);  
    106.     }  
    107. }  



    HTTP相应状态码:

    总结:

    restful就是旧技术,新风格.之前写过一篇关于restful接口的博客:【Restful接口】restful接口的两种使用方式

  • 相关阅读:
    sql where 与 having的区别
    Linux下shell脚本监控Tomcat的状态并实现自动启动
    CentOS MySQL自动备份shell脚本
    HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义
    Linux下搭建禅道项目管理软件
    JMeter压力测试及并发量计算-2
    JMeter压力测试及并发量计算-1
    Eclipse常用快捷键大全
    常用的adb命令
    js-消息对话框
  • 原文地址:https://www.cnblogs.com/silentdoer/p/8495815.html
Copyright © 2011-2022 走看看