REST

REST 即表述性状态传递(Representational State Transfer),是一种软件架构风格,指代使用不同的请求方式来表示这次请求需要完成的 CURD 的种类,然后在 URL 中携带被操作对象,

比如:

URL 请求方式 目的
/book/1 get 获取 1 号图书
/book post 添加图书
/book/1 put 更新图书
/book/1 delete 删除 1 号图书

这里面要说一下 Post 和 Put 的区别,在官方 HTTP 协议中,规定 Put 为 idempotent(幂等) 方法,也就是多次连续请求造成结果应该相同。因此 Put 应该执行更新方法,而 Post 应该执行非幂等(多次执行添加请求会添加多个)的添加方法。

实现 REST

因为 HTML 发起请求的方式只有 GET 和 POST,所以为了实现 REST,我们可以曲线救国。在 GET 或者 POST 里面添加请求参数,_method,放入 delete 和 put 作为参数,然后在 web.xml 中配置一个 Srping 的 Filter:HiddenHttpMethodFilter,过滤范围为所有的请求。

这个 Filter 会去查找是否拥有 _method 参数并且数据的请求类型是否为合法(指是否为 HTTP 协议里面的类型),如果合法,那么这个 Filter 会将 HttpRequest 里面的请求方法修改为我们设置的 _method 参数数据。

最后需要注意的是,在大于等于 8.0 版本的 Tomcat 里面使用 REST 的时候,因为 JSP 认为不是 Get 或者 Post 的请求都是有问题的,会爆出错误页面,为了掩盖这个问题,将当前 JSP 页面的页头添加设置 isErrorPage="true",就可以让 Tomcat 忽略这个问题了。

获取请求信息

请求参数

标准参数

  1. 方法声明变量名,参数名和变量名匹配的话就会将参数值传入方法中,比如下面当有参数: username=XXX 的时候,发现方法参数和请求参数名相匹配,就会将 XXX 传入方法中,没带则传入 null。
1
2
3
4
5
@RequestMapping("/")
public String getUsername(String username) {
System.out.println(username);
return "hello";
}
  1. 使用 @RequestParam 注解标注方法参数。

(RequestParam(value = "user",required = false,defaultValue = "No_Name") String username) 主要是解决方法参数名和请求参数名不一样的问题,给 value 附上别名即可(当然附上别名就只能使用别名来让方法参数接收数据了),required 则是标注这个参数是否必须要有(如果没有页面会报错 Required Parameter XXX)


POJO

SpringMVC 支持 POJO 类型的请求自动封装,会自动将符合匹配条件(名字一样)的请求参数放入 POJO 中。还支持 POJO 的级联封装,只需要加 . 即可:address.home=Xorex&address.school=CUIT 就是对 Address 里的两个 String 进行赋值。

1
请求:username=Xorex&password=Xorex&address.home=Xorex&address.school=CUIT&Xorex=Tempest
1
2
3
public String getUsername(User user,String username)  {// 两个封装并不冲突
return "hello";
}

原生参数

SpringMVC 支持自动传入原生 ServletAPI,直接写在方法的参数里面即可,会按照类型填入,支持类型:

  1. HttpServletRequest
  2. HttpServletResponse
  3. HttpSession
  4. java.security.Principal
  5. Locale
  6. InputStream
  7. OutputStream
  8. Reader
  9. Writer

请求头

使用 @RequestHeader 注解获取请求头信息,value 填写请求头名称, required 和 defaultValue 参考上面。

使用 @CookieValue 注解获取请求中的 Cookie 信息,value 填写 Cookie 的 key,required 和 defaultValue 参考上面。

请求响应乱码

  1. GET 请求乱码:

GET 乱码主要是 Tomcat 中 Connector 对请求的解析的问题,只需要在 8080 端口的 Connector 的设置(在 server.xml 中)里添加 URLEncoding=”UTF-8” 即可、

  1. POST 请求乱码:\

在 HttpServletRequest 实例设置 setCharacterEncoding(“UTF-8”),或者写一个 Filter 将所有的请求提前设置一下。

最最最重要的是,Spring 内置了这个 Filter,不需要我们自己写!是 CharacterEncodingFilter ,直接配置到 web.xml 中即可,可选配置请求乱码 encoding 和相应乱码 forceEncoding 一起改:

更更更重要的是,这个 Filter 要放到其他的 Filter 前面,因为可能其他 Filter 回对请求里面的数据进行处理,应该修改完编码类型之后才可以!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>