http请求报文Header里的Content-Type类型以及SpringMVC解析该类型使用的注解

     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)进行编码,其中不含任何控件或格式字符

发布了225 篇原创文章 · 获赞 30 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_35634181/article/details/90080734