哈喽大家好今天跟大家简单聊一聊PostMappering中consumers与produces两个属性的作用
在对接接口中,对方API要求,请求头 HTTP Header 中设置 Content-Type 为 application/x-www-form-urlencoded,响应头 HTTP Header 中 Content-Type 为 application/json。也就是说一个接口中,接收参数方式是application/x-www-form-urlencoded,但是响应回去的方式又是JSON
过程中我犯了傻,请求是form表单形式,我还有requestBody注解的方式接收参数,
form表单提交接收参数的几种方式:
1.request.getParameter("参数名");
@PostMapping(value ="/testT")
public void test(HttpServletRequest request) throws Exception {
String name=request.getParameter("name");
String age=request.getParameter("age");
System.out.println("请求到的参数:name="+name+",age="+age);
}
请求到的参数:name=Angle,age=24
2.@RequestParam(value="参数名")
一个一个参数接收,如果参数比较多,不好用
@PostMapping(value ="/testT")
public void test(@RequestParam(value="name") String name,@RequestParam(value="age") Integer age) throws Exception {
System.out.println("请求到的参数:name="+name+",age="+age);
}
请求到的参数:name=Angle,age=24
3.@ModelAttribute()
自定义实体接收
@PostMapping(value ="/test")
public void test(@ModelAttribute() TestRequest testRequest) throws Exception {
System.out.println("接收到的参数:"+JSON.toJSONString(testRequest));
}
接收到的参数:{"age":"24","name":"Angle"}
4.request.getParameterMap();
将获取参数map
@PostMapping(value ="/testT")
public void test(HttpServletRequest request) throws Exception {
Map<String, String> paramMap = Reflections.transToStringMAP(request.getParameterMap());//获取请求参数并转为Map对象
ObjectMapper objectMapper=new ObjectMapper();
TestRequest testRequest=objectMapper.readValue(JSONObject.toJSONString(paramMap), TestRequest.class);
使用ObjectMapper将map转为实体
System.out.println("请求到的参数:"+JSON.toJSONString(paramMap));
System.out.println(testRequest);
}
请求到的参数:{"name":"Angle","age":"24"}
TestRequest [name=Angle, age=24]
配合使用也可以实现@ModelAttribute()注解方式接收参数,建议使用注解方式获取参数,简单明了
回归正题下面主要聊的是consumers与produces两个属性
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
都可以设置多值
例子:返回JSON类型
@PostMapping(value ="/test1", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public TestRequest test1(@ModelAttribute() TestRequest testRequest) throws Exception {
System.out.println(testRequest);
return testRequest;
}
可以正常返回:
{
"name": "Angle",
"age": "24"
}
@PostMapping(value ="/test2", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public TestRequest test2(@ModelAttribute() TestRequest testRequest) throws Exception {
System.out.println(testRequest);
return testRequest;
}
返回报错
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver -Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]
两种属性的区别:
consumes 标识处理request Content-Type为“application/x-www-form-urlencoded”类型的请求.
produces标识处理request请求中Accept头中包含了"application/x-www-form-urlencoded"的请求.
返回的内容类型为application/x-www-form-urlencoded;(返回类型与请求类型一致)
所以项目中使用了consumes 属性,因为请求的Content-Type与返回的Content-Type不一致