表单数据默认的提交方式是“application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。
1、enctype属性值
值 | 描述 |
application/x-www-form-urlencoded | 在发送前编码所有字符(默认) |
multipart/form-data | 不对字符编码。 在使用包含文件上传控件的表单时,必须使用该值。 |
text/plain | 空格转换为 "+" 加号,但不对特殊字符编码。 |
我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。
规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:
BASH<method> <request-URL> <version>
<headers>
<entity-body>
服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
1.1、application/x-www-form-urlencoded
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 <form> 表单,如果不设置 enctype
属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。
1.1.1、Spring中设置-@RequestParam
Spring
中用@RequestParam
来处理Content-Type
为application/x-www-form-urlencoded
数据。修饰的对象可以是基本数据类型和自定义对象。
@RequestParam的原理是Spring
将Request.getParameter()
中的Key-Value
参数Map
转化成了参数@RequestParam
修饰的基本类型数据或对象。
@RequestParam同时适用于get和post,只要Content-Type
为application/x-www-form-urlencoded
。
1.2、multipart/form-data
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 <form> 表单的enctype 等于 multipart/form-data。
1.2.1、Spring中设置
可以使用@RequestPart
处理接收到的文件。
示例如下:
/**
* 单文件上传
* @param file
* @param bucket
* @return
*/
@RequestMapping("uploadFile")
public JsonResult uploadFile(@RequestPart("file") MultipartFile file, @RequestParam String bucket){
String fileUrl = aliossService.uploadFile(file, bucket);
Map<String,String> result = new HashMap<>();
result.put("fileUrl",fileUrl);
return success(result);
}
1.3、application/json
application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。
1.3.1、Spring中设置-@RequestBody
-
GET
请求中,因为没有HttpEntity
,所以@RequestBody
并不适用。 -
POST
请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type
,SpringMVC
通过使用HandlerAdapter
配置的HttpMessageConverters
来解析HttpEntity
中的数据,然后绑定到@RequestBody修饰的对象上。 - @RequestBody 也可以处理
application/xml