HTTP请求由状态行、请求头、请求正文三部分组成:
状态行:包括请求方式Method、资源路径URL、协议版本Version;
请求头:包括一些访问的域名、用户代理、Cookie等信息;
请求正文:就是HTTP请求的数据。
在请求头中有Content-Type属性,它用来定义传输给服务器的数据编码格式,对于不同的编码格式服务器的处理方式也是不同的,这一点也容易出错。
Content-Type描述的只是发送端,发送端既可以是服务器也可以是客户端,Content-Type代表发送端发送的实体数据的数据类型。比如:Content-Type:text/html,代表发送端发送的数据格式是html
Content-Type的常见类型有:
1.application/x-www-form-urlencoded:数据被编码为名称/值对。这是标准的编码格式。
特点:键值对形式,key=value
请求时数据存在方式:
action为get时,请求参数存在于url中,参数与参数之间有&分割,形如:
https://www.baidu.com/s?rsv_sug7=100&rsv_sug2=0&rsv_sug4=10082
action为post时,请求参数存在于Form data中,参数与参数之间用&符号分割,形如:
key1=value1&key2=value2&key3=value3
总之application/x-www-form-urlencoded会将数据被编码为名称/值对,这一点很重要。
接收时数据接收方式:
(1)使用@RequestParam接收,底层使用HttpServletRequest.getParameter("参数名称")来完成。
@RequestParam(value="name", required=true, defaultValue="lisi")
value: 参数名称
required:是否为必要值,默认为true,为true时如果不存在这个参数那么会报404错误
defaultValue:默认值
具体使用:
//完整写法
public String requestparam(@RequestParam(value="name", required=true, defaultValue="lisi") String name)
(2)使用@ModelAttribute,使用该注解将请求参数绑定到指定对象上
关于@ModelAttribute的使用,请参考
springmvc基础知识(20):@ModelAttribute 的使用
spring学习之@ModelAttribute运用详解
(3)最原始的方式,使用HttpServletRequest.getParameter("参数名称")
2.multipart/form-data: 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
当from表单中的enctype属性为multipart/form-data,method="post"时,浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name
)等信息,并加上分割符(boundary)。
需要在表单中进行文件上传时,就需要使用该格式。
该种媒体格式主要用于请求参数为二进制数据或者表单数据
特点:数据与数据之间用自定义分隔符进行分割
请求时数据存在方式:
数据存在Request payload中,数据格式类似如下:
\r\n-----------------asd\r\n
content-Disposition:form-Data;name="方法名";filename=“文件名”\r\n
content-type:image/jpeg\r\n\r\n
-----------------asd
二进制文件流
接收时数据接收方式:
(1)HttpServletRequest.getInputStream();
(2) HttpServletRequest.getReader();
3.application/json: JSON数据格式
现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。
JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。记得我几年前做一个项目时,需要提交的数据层次非常深,我就是把数据 JSON 序列化之后来提交的。不过当时我是把 JSON 字符串作为 val,仍然放在键值对里,以 x-www-form-urlencoded 方式提交。
对于application/json,会将数据以json字符串进行传递
请求时数据的存在方式:
数据存在Request payload中,数据格式为如下:
{
key1:val1,
key2:val2
}
---------------------
接收时数据的接收方式:
(1) 使用注解@RequestBody解析对象,@RequestBody注解会解析请求正文中json字符串,底层使用HttpServletRequest.getInputStream来完成。
(2)HttpServletRequest.getInputStream
(3)HttpServletRequest.getReader();
4.
text/plain: 数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符