前端post请求Content-Type和后端对应的接收参数方式

今天遇到一个奇葩问题,废了大半天,原来是没有理解前端发送http请求传参方式,不同的content-type会进行不同传参,后台也要用不同的方式接受,在此记录一下;
我们的程序使用的是前后端分离,前端使用vue,所有的请求都做的拦截的设置:

// request拦截器设置
service.interceptors.request.use(
  config => {
    switch (config.urlType) {
      case 'autoService':
        config.url = autoBaseURL + config.url
        break
      default:
        config.url = appBaseURL + config.url
    }
    // console.log("改头",config.url);
    const token = getToken()
    if (token) {
      config.headers['Authorization'] = token // 请求头设置自带 token
    }
    config.headers['Content-Type'] = 'application/json' // 请求的数据格式为 json
    return config
  },
  error => {
    console.log(error)
    Promise.reject(error)
  }
)

可以看到请求头的Content-Type被设置了application/json格式,但是后台有一个接口是使用@RequestParam注解接受,这样就提示请求错误:400 bad request;查了一下,原来application/json格式是把参数放入请求body中的,后台如果想接受,要使用@RequestBody才行,但是我又不能修改别人的接口,所以在前端中,我可以使用formdata方式进行传参:

	searchData() {
        let params = new FormData();
        params.append('inputMac', this.inputMac);
        getcode(params).then(res => {
          this.result=res
        })
    }

这样就OK了;

总结Content-Type和后端对应的接收参数方式

Content-Type常用到的值:

  • application/x-www-form-urlencoded 默认值;
  • application/json : JSON数据格式;
  • multipart/form-data;
  • application/octet-stream : 二进制流数据(如常见的文件下载)

当然还有很多可选的值,这里就不一一列出了;

post请求

1、当使用form-data、x-www-form-urlencoded时:后台不可以用@RequestBody;可以用@RequestParam。可以理解成参数都在请求param中,而不在请求体;
2、当使用application/json时:后台json字符串部分可以用@RequestBody;url中拼接的参数可以用@RequestParam

从注解的维度考虑

  • (@RequestBody Map map),(@RequestBody Object object);
    application/json时候可用,form-data、x-www-form-urlencoded时候不可用

  • (@RequestParam Map map);
    application/json时候,json字符串部分不可用,url中的?后面添加参数即可用,form-data、x-www-form-urlencoded时候可用,但是要将Headers里的Content-Type删掉

  • (@RequestParam String waterEleId,@RequestParam String enterpriseName);
    application/json时候,json字符串部分不可用,url中的?后面添加参数即可用
    form-data、x-www-form-urlencoded时候可用,且参数可以没有顺序(即前端传过来的参数或者url中的参数顺序不必和后台接口中的参数顺序一致,只要字段名相同就可以),但是要将Headers里的Content-Type删掉

  • (@RequestParam Object object);
    不管application/json、form-data、x-www-form-urlencoded都不可用

  • 既不是@RequestBody也不是@RequestParam,没有指定参数哪种接收方式: (Map map),(Object object);
    application/json时候:json字符串部分不可用,url中的?后面添加参数不可用。
    因为没有指定,它也不知道到底是用json字符串部分还是?后面添加参数部分,所以干脆都不可以用
    form-data、x-www-form-urlencoded时都不可用

  • (HttpServletRequest request)
    application/json不可用
    form-data、x-www-form-urlencoded时可用

get请求

只能使用@RequestParam注解接受参数
从注解维度考虑:

  • RequestBody – Map / Object
    GET请求中不可以使用@RequestBody
  • (@RequestParam Map map)
    在url中的?后面添加参数即可使用
  • (@RequestParam String waterEleId,@RequestParam String enterpriseName)
    在url中的?后面添加参数即可使用
    (@RequestParam Object object)
    GET请求中不可以使用

参考来源 https://blog.csdn.net/weixin_38004638/article/details/99655322

  • 22
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: axios是一种用于发送HTTP请求JavaScript库。它提供了两种发送POST请求方式:一种是通过请求体发送数据,另一种是通过URL参数发送数据。下面是对这两种方式以及前端axios发送请求后端Spring Boot应用程序如何接收请求的解释。 1. 请求方式: 通过axios的post方法发送POST请求时,可以将数据作为请求体的一部分发送给后端。在发送请求时,我们可以将数据以对象的形式传递给axios的post方法。 例如,在前端使用axios发送请求: ```javascript axios.post('/api/user', { username: 'John', password: '123456' }) ``` 在后端的Spring Boot应用程序中,我们可以使用`@RequestBody`注解来接收请求体中的数据。通过该注解,Spring Boot会自动将请求体中的JSON数据映射到对应的Java对象上。 例如,在后端的控制器中接收请求: ```java @PostMapping("/api/user") public ResponseEntity<?> createUser(@RequestBody User user) { // 处理接收到的用户数据 ... } ``` 2. URL参数方式: 通过axios的post方法发送POST请求时,也可以将数据作为URL参数的一部分发送给后端。在发送请求时,我们可以通过在URL中添加查询参数方式将数据传递给axios的post方法。 例如,在前端使用axios发送请求: ```javascript axios.post('/api/user?username=John&password=123456') ``` 在后端的Spring Boot应用程序中,我们可以使用`@RequestParam`注解来接收URL参数中的数据。 例如,在后端的控制器中接收请求: ```java @PostMapping("/api/user") public ResponseEntity<?> createUser(@RequestParam String username, @RequestParam String password) { // 处理接收到的用户名和密码 ... } ``` 这样,我们就可以通过axios的post方法以两种不同的方式发送POST请求,并通过`@RequestBody`或`@RequestParam`在后端的Spring Boot应用程序中接收请求数据。 ### 回答2: axios post请求方式有两种,一种是普通post请求,另一种是使用FormData对象进行post请求。这两种方式可以分别用@RequestParam和@RequestBody接收请求参数。 普通post请求方式可以通过设置请求头`'Content-Type': 'application/json'`来发送json格式的数据,并使用axios的data参数传递请求参数后端接口可以使用@RequestBody注解来接收请求参数。@RequestBody注解将请求体中的数据绑定到一个对象上,可以直接使用该对象进行操作。 示例代码如下: 前端代码: ```javascript axios.post('/api/post', { key1: value1, key2: value2 }, { headers: { 'Content-Type': 'application/json' } }).then(response => { console.log(response.data); }).catch(error => { console.log(error); }); ``` 后端代码: ```java @RestController public class PostController { @PostMapping("/api/post") public ResponseEntity<?> handlePostRequest(@RequestBody PostData postData) { // 处理post请求参数 // ... return ResponseEntity.ok("Success"); } } public class PostData { private String key1; private String key2; // 省略getter和setter方法 } ``` 使用FormData对象进行post请求时,可以使用axios的data参数传递FormData对象。设置请求头`'Content-Type': 'multipart/form-data'`。后端接口可以使用@RequestParam注解来接收请求参数。@RequestParam注解用于获取请求参数的值。 示例代码如下: 前端代码: ```javascript const formData = new FormData(); formData.append('key1', value1); formData.append('key2', value2); axios.post('/api/post', formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then(response => { console.log(response.data); }).catch(error => { console.log(error); }); ``` 后端代码: ```java @RestController public class PostController { @PostMapping("/api/post") public ResponseEntity<?> handlePostRequest(@RequestParam("key1") String key1, @RequestParam("key2") String key2) { // 处理post请求参数 // ... return ResponseEntity.ok("Success"); } } ``` 以上就是使用axios post发送两种请求方式,并使用@RequestParam和@RequestBody接收请求参数的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值