小结
今天用axios+springboot时候发现点问题
vue中axios发送post请求
axios.post默认是application/json方式提交数据,不是表单 ajax中的post默认是表单的方式提交 psot表单方式提交 application/x-www-form-urlencoded 采用&拼接
public JsonResult addMessage(@RequestParam("userId") int userId,@RequestParam("goodId") int goodId,@RequestParam("content") String content) {
Message message = new Message();
message.setUid(userId);
message.setGid(goodId);
message.setContent(content);
System.out.println(message);
return messageService.addMessage(message);
}
和
public JsonResult addMessage(@RequestBody Message message)
最终解决方案参考:www.jianshu.com/p/042632dec…
let param = new URLSearchParams();
param.append("userId", this.addMessage.userId);
param.append("goodId", this.addMessage.goodId);
param.append("content", this.addMessage.content);
this.$axios.post('/addMessage',param).then((res) => {
//处理内容
});
其实原因很简单,因为axios post一个对象到后端的时候,是直接把json放到请求体中的,提交到后端的,而后端是怎么取参数的,是用的
@RequestParam
这个是什么意思,这个是只能从请求的地址中取出参数,也就是只能从username=admin&password=admin这种字符串中解析出参数,这样是不能提取出请求体中的参数的。
@RequestBody Pojo pojo
通过@RequestBody 注解,springmvc可以把json中的数据绑定到Map中, 我们就可以取出了. 或者也可以
@RequestMappting("/api/doLogin")
@ResponseBody
public Object doLogin(@RequestBody Map map) throws Exception {
System.out.println("username: "+map.get("username"));
System.out.println("password: "+map.get("password"));
JSONObject json = new JSONObject();
json.put("success", true);
return json;
}
在此之前,写项目一直用的是@RequestParam(value="aa" required=false)这个注解,但是并不知道它的意思。现在懂了,特来记录下。
1、可以对传入参数指定参数名
1 @RequestParam String inputStr
2 // 下面的对传入参数指定为aa,如果前端不传aa参数名,会报错
3 @RequestParam(value="aa") String inputStr
2、可以通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传
1 // required=false表示不传的话,会给参数赋值为null,required=true就是必须要有
2 @RequestMapping("testRequestParam")
3 public String filesUpload(@RequestParam(value="aa", required=true) String inputStr, HttpServletRequest request)
3、如果@requestParam注解的参数是int类型,并且required=false,此时如果不传参数的话,会报错。原因是,required=false时,不传参数的话,会给参数赋值null,这样就会把null赋值给了int,因此会报错。
1 // required=false表示不传的话,会给参数赋值为null,required=true就是必须要有
2 @RequestMapping("testRequestParam")
3 public String filesUpload(@RequestParam(value="aa", required=false) int inputStr, HttpServletRequest request)
4 若是前端页面不传参的话,此处就会报错。当然可以用Integer代替int
总结
@RequestBody:都支持,除了application/x-www-form-urlencoded,他会从请求体中拿出数据做映射
@RequestParam:只有支持application/x-www-form-urlencoded的格式,
确实设置了
后台拿不到的
正确方式!
new URLSearchParams对象
也就是
解决详情:www.cnblogs.com/jszhp/p/101…
\