【Restful】三分钟彻底了解Restful最佳实践

   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

HTTP相应状态码:

  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 }

总结:

restful就是旧技术,新风格.

原文地址:https://www.cnblogs.com/huangjinyong/p/8653576.html