restful post请求_基于MVC的RESTful风格的实现

1.RESTful风格阐述

REST服务是一种 ROA(Resource-Oriented Architecture,面向资源的架构)应用。主要特点是方法信息存在于 HTTP协议的方法中( GET, POST, PUT, DELETE),作用域存在于 URL中。例如,在一个获取设备资源列表的 GET请求中,方法信息是 GET,作用域信息是URI种包含的对设备资源的过滤、分页和排序等条件
良好的 REST API不需要任何文档

1.1REST风格资源路径

REST风格的资源路径设计是面向资源的,资源的名称应该是准确描述该资源的名词。

资源路径概览: sheme://host:port/path?queryString
例: http:// localhost:8080/bywlstud io/users/user?username=xiuer

1.2HTTP方法

GET用于读取、检索、查询、过滤资源 PSOT用于创建一个资源 PUT用于修改、更新资源、创建客户端维护主键信息的资源 DELETE用于删除资源

资源地址和HTTP方法结合在一起就可以实现对资源的完整定位

1.3RESTful风格API设计

上文讲述了通过HTTP方法和资源路径对服务器的一个资源进行定位的过程

接下来看一个REST风格API的设计

021a2e6dcdfcc11a4f024b5c526f3fca.png
REST API

可以看到通过这个RESTAPI都是通过对同一个资源的操作,所不同的就是通过不同的HTTP方法来实现对资源不同的处理。

2.MVCREST的支持

1.1主要通过注解来实现

  • @Controller声名一个处理请求的控制器
  • @RequestMapping请求映射地址,它存在几个子注解对于实现REST风格来说更加具有语义性
    • GETMapping GET请求
    • PUTMapping PUT请求
    • POSTMapping POST请求
    • DELETEMapping DELETE请求sponseBody 将响应内容转换为JSON格式
  • @RequestBody 请求内容转换为JSON格式
  • @PathVariable("id")用于绑定一个参数
  • @RESTController 等同于@Controller+@ResponseBody在类上写了这个注解,标识这个类的所有方法只返回数据,而不进行视图跳转

1.2返回HTTP状态码

REST风格API一个最鲜明的特点通过返回对应的HTTPStatus来判断客户端的操作是否完成

下面是spring中关于Http状态码描述的枚举类,本文列举了常见的状态码(读者若对此感兴趣可以查看HttpStatus源码)

 public enum HttpStatus{
     OK(200, "OK"),//用于服务器有实体响应
     CREATED(201, "Created"),//创建了新实体,响应该实体
     NO_CONTENT(204, "No Content"),//服务器正常响应,但无实体响应
     BAD_REQUEST(400, "Bad Request"),//客户端请求语法错误
     NOT_FOUND(404, "Not Found"),//目标资源不存在
     INTERNAL_SERVER_ERROR(500, "Internal Server Error"),//服务器内部错误
     NOT_IMPLEMENTED(501, "Not Implemented"),//服务器不支持当前请求
 }

Spring返回状态码是通过@ResponseStatus注解或者ResponseEntity<?>类实现的。

@ResponseStatus方式

 @GetMapping(path = "/user/{id}" , produces = "application/json;charset=utf-8")
 @ResponseStatus(HttpStatus.OK)
 public User findUserById(@PathVariable("id")Integer id){
     User user = userService.findUserById(id);
     return user ;
 }

ResponseEntity<?>方式

 @GetMapping(produces = "application/json;charset=utf-8")
 public ResponseEntity<List<User>> findAll(){
     List<User> users = userService.findAll();
     return new ResponseEntity<List<User>>(users , HttpStatus.OK);
 }

1.3由于MVC默认不支持PUTDELETE方法,所以需要手动开启

tomcat服务器的web.xml文件中开启一下配置

 <servlet>
         <servlet-name>default</servlet-name>
         <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
         <init-param>
             <param-name>debug</param-name>
             <param-value>0</param-value>
         </init-param>
         <init-param>
             <param-name>listings</param-name>
             <param-value>false</param-value>
         </init-param>
         <init-param>
         <param-name>readonly</param-name>
         <param-value>true</param-value><!--开启这个-->
         </init-param>
         <load-on-startup>1</load-on-startup>
     </servlet>

在项目的web.xml中配置

 <filter>
     <filter-name>HiddenHttpMethodFilter</filter-name>
     <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
   </filter>
 ​
   <filter-mapping>
     <filter-name>HiddenHttpMethodFilter</filter-name>
     <servlet-name>dispathcherServlet</servlet-name>
   </filter-mapping>

3.MVC实现REST代码实现

3.1实例环境

  • JDK1.8
  • maven3.60
  • tomcat9

3.2API设计

e995d1ecb5b944449e19e23258e4bcd9.png
API设计

3.3控制层代码

 @RestController
 @RequestMapping("/users")
 public class UserControler {
 ​
     @Autowired
     private IUserService userService ;
 ​
     //REST风格实现方法
 ​
     /**
      * 查询所有
      * @return
      */
     @GetMapping(produces = "application/json;charset=utf-8")
     public ResponseEntity<List<User>> findAll(){
         List<User> users = userService.findAll();
         return new ResponseEntity<List<User>>(users , HttpStatus.OK);
     }
 ​
     /**、
      * 根据ID查询
      * @param id
      * @return
      */
 ​
     @GetMapping(path = "/{id}" , produces = "application/json;charset=utf-8")
     @ResponseStatus(HttpStatus.OK)
     public User findUserById(@PathVariable("id")Integer id){
         User user = userService.findUserById(id);
         return user ;
     }
     /**
      * 增加一个用户
      * 返回该用户
      */
     @PostMapping(produces = "application/json;charset=utf-8")
     @ResponseStatus(HttpStatus.CREATED)
     public User addUser(@RequestBody User user){
         User newUser = userService.addUser(user);
         return newUser ;
     }
 ​
     /**
      * 更新
      * @param user
      */
     @PutMapping(path = "/{id}" ,produces = "application/json;charset=utf-8")
     public ResponseEntity<User> updateUser(@PathVariable("id") Integer id , @RequestBody User user){
         user.setUid(id);
         //资源是否修改
         boolean flag = userService.updateUser(user);
         User deUser = userService.findUserById(id);
         if(flag)
             return new ResponseEntity<User>(deUser,HttpStatus.CREATED);
         return new ResponseEntity<User>(deUser,HttpStatus.OK);
     }
 ​
     @DeleteMapping(path = "/{id}"  , produces = "application/json;charset=utf-8")
     @ResponseStatus(HttpStatus.NO_CONTENT)
     public void delUser(@PathVariable("id") Integer id){
         User user = userService.findUserById(id);
         userService.delUser(id);
     }
 }

本文项目地址:

946470326/MakerStack​github.com
0f5104e9c74977ea5f2ff9e4e7499314.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值