1. Content-Type
  • http使用请求头 Content-Type 告诉服务器端,这次请求数据的数据格式
  • http响应头里面也有 Content-Type ,这是服务器告知前端浏览器应该怎么去解析这个请求数据的。
  • 使用Content-Type是告诉另外一端,我给你的数据是什么格式
  1. Accept
  • Accept请求头可以告知告知服务器端,自己想获取什么样的格式,不传默认是*
  • 服务器端可以通过这个请求头,动态的返回指定的数据格式。如果服务器端不支持客户端想要的格式,会报错。
  1. 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>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 如果同时存在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();
	}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 默认返回格式(指定Accept=application/xml也是一样)
  • 指定Accept=application/xml
  • http请求头contentType和accept_请求头

  1. 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();
	}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 如果不accept和produces 不匹配请求直接报错
  • http请求头contentType和accept_请求头_02

  • 不填就是*,表示任意格式,和 任意produces 类型都是匹配的
  • http请求头contentType和accept_json_03

  1. 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";
	}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • @RequestBody 会强制要求 Content-Type 是application/json类型,和写了consumes = {MediaType.APPLICATION_JSON_VALUE}一样。
  • 如果没有写@RequestBody,并且没有限制没有加consumes = {MediaType.APPLICATION_JSON_VALUE},那么任意任意类型的Content-Type 都可以请求这个接口,但是json格式是收不到请求参数的,这可能导致导致调试很久才查到问题
  • Content-Type 和 consumes限定的类型不匹配
  • http请求头contentType和accept_xml_04

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