问题描述:
今天在写单元测试的时候,发现controller 方法中一直接收不到我的参数信息
1.post 方法 2.方法体没有用@RequestBody 接受参数
controller里面的方法
@ResponseBody
@PostMapping("list")
public JsonResult login(WearUserInfo wear){
System.out.println(wear);
JsonResult login = loginService.login(wear);
return login;
}
单元测试里面的方法: conent-type:application/json? ?数据:json格式
String responseString = mockMvc.perform( post("/login")
.contentType(MediaType.APPLICATION_JSON)
.content(JSONObject.toJSONString(userInfo))).andDo(print())
.andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
一直接收不到参数, user一直未null ,我就去看页面请求,就发现问题了?
问题: 我在看页面请求的时候,发现?
????????????????????????请求正文是: Form Data
? ? ? ? ? ? ? ? ? ? ? ?Content-Type: application/x-www-form-urlencoded
?
?
?问题原因:
Http post请求:
Content-Type: application/json
-
Request Payload? - 请求头部的?
Content-Type: application/json , - 请求正文是一个 json 格式的字符串
?
后台处理:
?对于 Request Payload 请求, 必须加?@RequestBody ?才能将请求正文解析到对应的 bean 中,且只能通过?request.getReader() ?来获取请求正文内容
Content-Type: application/x-www-form-urlencoded ?
Form Data?:?传统的Form表单提交
请求头部的?Content-Type: application/x-www-form-urlencoded ,
请求正文是类似 get 请求 url 的请求参数
?
后台处理:
对于 Form Data 请求,无需任何注解,springmvc 会自动使用 MessageConverter 将请求参数解析到对应的 bean,且通过?request.getParameter(...) ?能获取请求参数
问题解决:
修改我们的单元测试:??
类型修改为:application/x-www-form-urlencoded ?
参数封装为: name=zhangsna&id=1? 的格式
就可以了,controller里面也能正常接收参数了
end
附上对象转换为 url参数格式的方法: 如果有不正确的欢迎指出奥!!?
public static String urlAppendFiled(Object o){
//1.获取对象的私有属性
Class<?> aClass = o.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
StringBuffer buffer = new StringBuffer();
try {
for(Field field:declaredFields){
//2.获取属性值,如果值不为空的话进行拼接
field.setAccessible(true); //属性是私有的,如果要获取值,就要设置setAccessible
Object filedValue = field.get(o);
if(filedValue!= null){
buffer.append("&").append(field.getName()).append("=").append(filedValue);
}
}
}catch (Exception e){
e.printStackTrace();
}
buffer.delete(0,1);
return buffer.toString();
}
发现自己其实对 http协议 了解的还是不够深入,准备接下来深入了解一下
|