Rest ful 风格的api

REST ful

全称是Resource Representational State Transfer - ful

  • Resourse: 资源,即数据
  • Representational: 表现形式的,例如json,xml等
  • State: 状态
  • Transfer: 转移
  • ful:形容词后缀,标识xxx风格的

连起来就是数据资源的状态变化表现在api的一种风格

即前端向后端发出对数据的增删改查的请求路径

传统的api

  • 查询所有:GET /user/get/all 或者 GET /user/list
  • 根据id查询:GET /user?id=1
  • 添加:POST /user/add
  • 修改:POST /user/update
  • 删除:GET /user/delete?id=1 或者 GET /user/remove?id=1

使用RESTful

  • 查询所有:GET /user
  • 根据id查询:GET /user/1
  • 添加:POST /user
  • 修改:PUT /user
  • 删除:DELETE /user/1

通过比较,我们可以发现RESTful风格api的优点

  • 风格统一,不会出现delUser/deleteUser/removeUser各种命名的代码了

  • 面向资源,一目了然,具有自解释性

  • 充分利用 HTTP 协议本身语义

注意

html的form不支持put和delete,只支持get和post

解决方法如下:

  1. 使用javascript的ajax来发送put和delete
  2. SpringMVC 提供了 HiddenHttpMethodFilter 帮助我们将 POST 请求转换为 DELETE 或 PUT 请求(较少使用,使用步骤如下)

HiddenHttpMethodFilter 处理put和delete请求的条件:

a.当前请求的请求方式必须为post

b.当前请求必须传输请求参数_method

满足以上条件,HiddenHttpMethodFilter 过滤器就会将当前请求的请求方式转换为请求参数_method的值,因此请求参数_method的值才是最终的请求方式

在web.xml中注册HiddenHttpMethodFilter

<filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

源码

if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {  
//this.methodParam="_method"
   String paramValue = request.getParameter(this.methodParam);  
   if (StringUtils.hasLength(paramValue)) {  
      String method = paramValue.toUpperCase(Locale.ENGLISH);  
      if (ALLOWED_METHODS.contains(method)) {  
         requestToUse = new HttpMethodRequestWrapper(request, method);  
      }  
   }  
}  
  
filterChain.doFilter(requestToUse, response);

后端

@RequestMapping(value = "/user" ,method = RequestMethod.PUT)  
public String insertUser(User user){  
    System.out.println("修改用户"+user);  
    return "success";  
}

前端
在这里插入图片描述

注:

目前为止,SpringMVC中提供了两个过滤器:CharacterEncodingFilter和HiddenHttpMethodFilter

在web.xml中注册时,必须先注册CharacterEncodingFilter,再注册HiddenHttpMethodFilter

原因:

  • 在 CharacterEncodingFilter 中通过 request.setCharacterEncoding(encoding) 方法设置字符集的

  • request.setCharacterEncoding(encoding) 方法要求前面不能有任何获取请求参数的操作

  • 而 HiddenHttpMethodFilter 恰恰有一个获取请求方式的操作:

    String paramValue = request.getParameter(this.methodParam);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值