HTTP请求时POST参数到底应该怎么传?

前言

接口请求现在基本上是应用必备了, 各个请求库用了这么多年从来没出什么岔子.
不过最近却产生了一点疑惑, 为什么之前用的好好的POST方法访问新接口时提示传递参数为空呢? 为什么网络上的接口请求测试工具中有两种参数形式呢?

这是因为 http 请求头内的 content-type 不一样导致的 (used with POST and PUT requests)


HTTP 请求头/响应头简述

这里摘录几张图片

请求三要素:
这里写图片描述
这里写图片描述

响应三要素
这里写图片描述
这里写图片描述

这里只分析请求头的content-type, 请他的请参考 https://en.wikipedia.org/wiki/List_of_HTTP_header_fields


header_content-type

根据应用场景的不同,HTTP请求的请求体有三种不同的形式, 通过header中的content-type指定, 这里只分析两个:

1. application/x-www-form-urlencoded(默认类型)

如果不指定其他类型的话, 默认是x-www-form-urlencoded, 此类型要求参数传递样式为 key1=value1&key2=value2

2. application/json

更适合传递大数据的形式, 参数样式就是json格式, 例如{"key1":"value1","key2":[1,2,3]}等.


常见网络请求工具的两种请求方式的写法

1. React-fetch
  1. application/x-www-form-urlencoded
    let formData = new FormData();
    formData.append("key", "value");
    
    fetch(url, {
            method: "POST",
            credentials: "include",
            body: formData,
            headers: {
                'content-type': 'application/x-www-form-urlencoded' // 或者不填
            },
    }).then(...)
    
    
  2. application/json
    let modelData= new ModelData();
    
    fetch(url, {
            method: "POST",
            credentials: "include",
            body: JSON.stringify(modelData),
            headers: {
                'content-type': 'application/json'
            },
    }).then(...)
    
    
2. Retrofit
  1. application/x-www-form-urlencoded
    @FormUrlEncoded
    @POST(url)
    fun getData(@Field("key") value: String): Observable<ResponseModel>
    
    
  2. application/json
    @POST(url)
    @Headers("Content-Type:application/json;charset=UTF-8")
    fun postTest(@Body body: PostData): Observable<ResponseModel>
    
    
3. OkGo
  1. application/x-www-form-urlencoded
    OkGo.<ResponseModel>post("http://asset.cns.com.cn/mobilescandim")
               .params("key1", "value1")
               .params("key2", "value2")
               .execute();
               
    
  2. application/json
    OkGo.<ResponseModel>post("http://asset.cns.com.cn/mobilescandim")
               .upJson("PostData对象的json字符串")
               .execute();
               
    
4. 网络接口请求测试工具
  1. application/x-www-form-urlencoded

    需要采用单独添加参数的方式
    这里写图片描述

  2. application/json

    批量添加参数
    这里写图片描述


附两张接口抓包截图

注意其中的 Content-Type

  1. 普通接口的Request:
    普通接口的Request

  2. 上传文件接口的Request上传文件接口的Request

  • 31
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值