http请求响应类型 spring请求响应类型

Posted lomi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了http请求响应类型 spring请求响应类型相关的知识,希望对你有一定的参考价值。

  1. Content-Type

    • http使用请求头 Content-Type 告诉服务器端,这次请求数据的数据格式
    • http响应头里面也有 Content-Type ,这是服务器告知前端浏览器应该怎么去解析这个请求数据的。
    • 使用Content-Type是告诉另外一端,我给你的数据是什么格式
  2. Accept

    • Accept请求头可以告知告知服务器端,自己想获取什么样的格式,不传默认是*
    • 服务器端可以通过这个请求头,动态的返回指定的数据格式。如果服务器端不支持客户端想要的格式,会报错。
  3. spring 对 Accept 的支持

    • 第一步,导入xml格式化的包(spring 默认已经导入了 json 格式的支持)

              <!--spring 返回xml格式的 支持-->
              <dependency>
                  <groupId>com.fasterxml.jackson.dataformat</groupId>
                  <artifactId>jackson-dataformat-xml</artifactId>
                  <version>2.13.5</version>
              </dependency>
      
    • 如果同时存在json格式化实现,和xml格式化的实现,@RestController 里面的方法默认使用的json

    • 请求方法

      	/**
      	 * 自动选择放回类型
      	 *
      	 * 可以通过请求头的 Accept=application/json 请求放回json
      	 * 可以通过请求头的 Accept=application/xml 请求访求放回xml格式
      	 * @return
      	 * @throws Exception
      	 */
      	@ApiOperation(value = "自动选择放回类型")
      	@RequestMapping(value="autoSelectionRtType", method= RequestMethod.GET)
      	@ShowParam
      	public Goods autoSelectionRtType() throws Exception
      		return  Goods.randomGoods();
      	
      
    • 默认返回格式(指定Accept=application/xml也是一样)

    • 指定Accept=application/xml

  4. spring 对请求头Accept 的限制

    • 即便已经支持了多种格式方式,但是spring可以通过 produces 来限制

    • produces 表示这个接口后端只会返回指定格式,前端想请求别的格式就会报错

    • 如果accept里面的请求的格式在produces 找不到,那么请求阶段就会报错

    • 例子代码

      	/**
      	 * 限定方法返回值类型一定application/xml,只有前端请求头Accept的格式支持application/xml的时候才能正常请求
      	 * @return
      	 * @throws Exception
      	 */
      	@GetMapping(value = "xml",produces = MediaType.APPLICATION_XML_VALUE )
      	@ShowParam
      	public Goods xml() throws Exception
      		return  Goods.randomGoods();
      	
      
      	/**
      	 * 限定方法返回值类型一定application/json,只有前端请求头只有Accept的格式支持application/json的时候才能正常请求
      	 * @return
      	 * @throws Exception
      	 */
      	@GetMapping(value = "json",produces = MediaType.APPLICATION_JSON_VALUE )
      	@ShowParam
      	public Goods json() throws Exception
      		return  Goods.randomGoods();
      	
      
    • 如果不accept和produces 不匹配请求直接报错

    • 不填就是*,表示任意格式,和 任意produces 类型都是匹配的

  5. spring 对请求头 Content-Type 的限制

    • spring 使用 consumes 限制 请求的Content-Type,表示这个方法只能的请求类容格式只能是指定值

    • consumes 表示 后端只接受指定格式的请求

    • 代码例子(下面的例子表示,请求的Content-Type必须是application/json,否则就会提示异常)

      	/**
      	 * 限定方法请求格式只能是json
      	 * @return
      	 */
      	@PostMapping(value = "reqFrom" ,consumes = MediaType.APPLICATION_JSON_VALUE)
      	@ShowParam
      	public String reqFrom() 
      		return "OK";
      	
      
    • @RequestBody 会强制要求 Content-Type 是application/json类型,和写了consumes = MediaType.APPLICATION_JSON_VALUE一样。

    • 如果没有写@RequestBody,并且没有限制没有加consumes = MediaType.APPLICATION_JSON_VALUE,那么任意任意类型的Content-Type 都可以请求这个接口,但是json格式是收不到请求参数的,这可能导致导致调试很久才查到问题

    • Content-Type 和 consumes限定的类型不匹配

    • 如果你确定你的post请求是application/x-www-form-urlencoded,可以考虑通过consumes 来限制,避免后端期望application/x-www-form-urlencoded格式,前端请求的content-type=application/json出现的能掉通接口,但是拿不到请求参数的情况。

HTTP请求格式响应格式及正文部分的MIME类型

HTTP请求格式:

HTTP协议规定,HTTP请求由3部分构成:

  • 请求方法、URI和HTTP协议的版本
  • 请求头
  • 请求正文

1.请求方法、URI和HTTP协议的版本:

HTTP请求的第一行包括请求方法、URI和协议版本这3项内容,以空格分开:

POST /hello.jsp HTTP/1.1

URI用于标识要访问的网络资源,在HTTP请求中,通常只要给出服务器的根目录的相对目录即可,以“/”开头。

2.请求头:

请求头包含许多有关客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器的类型、所用的语言、请求正文的类型以及请求正文的长度等。

3.请求正文:

HTTP协议规定,请求头与请求正文之间必须以空行分隔,它表示请求头已经结束,接下来是请求正文

 

HTTP响应格式:

HTTP响应也由3部分构成:

  • HTTP协议的版本、状态码和描述
  • 响应头
  • 响应正文

1.HTTP协议的版本、状态码和描述:

HTTP响应的第一行包括的3项内容以空格分开:

HTTP/1.1 200 OK

2.响应头:

响应头和请求头一样包含许多有用的信息,例如服务器类型、正文类型和正文长度等。

Server: Apache-Coyote/1.1
Content-type: text/html;charset=GBK
Content-length: 102

3.响应正文:

HTTP响应头与响应正文之间也必须以空行分隔

 

正文部分的MIME类型:

HTTP请求及响应的正文部分可以是任意格式的数据,如何保证接收方能看得懂发送方发送的正文数据呢?HTTP协议采用MIME协议来规范正文的数据格式。

文件扩展名MIME类型
.bin .exe .o .a .zapplication/octet-stream
.pdfapplication/pdf
.zipapplication/zip
.tarapplication/x-tar
.gifimage/gif
.jpg .jpegimage/jpeg
.htm .htmltext/html
.text .c .h .txt .javatext/plain
.mpg .mpegvideo/mpeg
.xmlapplication/xml
表单上传文件multipart/form-data

<form>标签的enctype属性:用于指定表单数据的MIME类型,取值为multipart/form-data,表示表单数据为复合类型的数据,包含多个子部分。

 

转载于:https://blog.csdn.net/weixin_30617737/article/details/95424157

以上是关于http请求响应类型 spring请求响应类型的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC 入门请求响应

解析json类型的请求体的问题,包含一个字符串列表到Spring响应中的字符串通量

HTTP请求格式响应格式及正文部分的MIME类型

HTTP系列篇之请求与响应

Http请求中Accept、Content-Type讲解以及在Spring MVC中的应用

HTTP协议的8种请求类型介绍