2021.12.12小结

156 阅读2分钟

小结

今天用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的格式,

image-20211212195439747

确实设置了

image-20211212195642847

image-20211212195652957

后台拿不到的

image-20211212195724551

正确方式!

new URLSearchParams对象

image-20211212200005295

image-20211212200029303

image-20211212200038599

image-20211212200057239

也就是

blog.csdn.net/qq_44884577…

image-20211212200626600

解决详情:www.cnblogs.com/jszhp/p/101…

\