body传参?parameter传参?Request Payload?Query String Parameter?

今天,后端来一个接口,告诉我“要用post请求,parameter形式传参”。over。
初级选手一般听到用post请求,但素用parameter传参一定很懵圈o((⊙﹏⊙))o。那么请先移步看这篇文章,get和post请求其实并没本质区别,他们都是tcp连接,post请求可以将参数放在body中,也可以是parameter形式,both fine!

但是对于post请求来说,后端所谓的“parameter形式传参”还有以下两个区别:

  • 第一种parameter形式的传参和一般get请求一样,参数会带在请求路径尾部,即?a=1&b=2&c=3…,对于这种形式的参数,在控制台可以看到参数形式是“Query String Parameter”。这种对应的request headers是 后端用req.query进行处理。
  • 第二种parameter形式的传参,被他们叫做“parameter”,但是它在请求时不会跟随到请求路径的尾部,即对外是不能直观看到的。对于这种形式的参数,在控制台可以看到参数形式是“Form Data”。它对应的Request Headers是: Content-Type:application/x-www-form-urlencoded。后端也用req.query进行处理。

总之,对于post请求这两种形式的parameter传参,后端的处理方式是一样的,他们也称之为“key=value形式传参”。

另一种更为常见的,也是前端普遍认为的post请求传参是放在所谓“body”中的,在控制台中可以看到参数形式叫做"request payload",它是json格式的参数。对于这种形式的参数,后台用req.body来处理。
接入正题~
一开始我是这么调用的:

    axios({
        method: 'post',
        url: '/xxx/xxx',
        data: {
            a: X,
            b: XX,
            c: XXXX,
            d: XXXXX
        }
    })

在这么写完后,打开控制台一看,是上面说的"request payload"参数形式。即后端所言"body传参",它是json格式的对象。不是他们所想要的…… 因而请求失败。-_-||

然后呢,我修改上述代码,把data改成params,如下:

   axios({
        method: 'post',
        url: '/xxx/xxx',
        params: {
            a: X,
            b: XX,
            c: XXXX,
            d: XXXXX
        }
    }) 

ok!这种可以成功请求接口,但是参数会尾随在请求路径后面,亦不是理想的传参形式,毕竟我们不想那么直接地把参数暴露出来。

肿么办?翻阅资料后,终于发现qs这个包。其实qs.stringify的作用和jquery的$.param()一样,把对象转换为键值对格式。

   import qs from 'qs' 
    axios({
        method: 'post',
        url: '/xxx/xxx',
        data: qs.stringify({ // >>>关键是这一步,将参数对象转变为key=value格式,这才是后端所想。这种方式,即不直观对外暴露参数,也达到使用“parameter形式”
            a: X,
            b: XX,
            c: XXXX,
            d: XXXXX
        })
    }) 

自己的补充,其实post请求,而参数形式为Query String Parameter,参数是塞到xhr.open里面了,代码如下

     var xhr = new XMLHttpRequest();
        xhr.open('post', reqURL+'user=yanjie&pass=12345&act=login', true);
        //只要是POST请求的参数的请求主体都必须写在xhr.send()方法中
        xhr.send();
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if (xhr.status == 200 || xhr.status == 304) {
                    callBack(xhr.responseText);
                }
            }
        }
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值