Http 提交数据的五种方式

推荐软件

推荐一款http调试工具,POSTMAN。
POSTMAN 的知名度在业界应该是排第一位的。云工程、可视化、语言翻译,都很好用。强烈推荐!

注意

提交的方式跟Method无关,POST 一样可以用 Query 提交,Get 也可以用 Formdata。Method 跟提交方式的匹配,更多的是工程规范上的约束而非能力限制。

Query 提交

一般接触的第一种提交方式。很简单,在 url 后 加一个 ? 号用于分割 url 路径与 参数 。多个参数用 & 符号隔开。
在这里插入图片描述

在这种方式下,由于参数是直接在 url 中体现的,url 中有些特殊字符就要进行“脱敏处理”,以免影响服务器对http协议的处理。比如空格:
在这里插入图片描述
在实际的代码里就变成了 %20,也就是进行了 URL 编码。具体的对应关系可以参考以下链接:
URL编码-百度百科

在 nodejs 中有直接的一对库函数可以解决:

const argsStr = encodeURI(args);
const args = decodeURI(argsStr);

URL Param 提交

亦即参数直接体现在 url 的 path 中。比如:
https://service.my/users/jack
其中的 jack 就是参数,用户名。

这种写法在 Restful Api 中相当常见,服务器路由会用类似如下的代码进行获取:

@Delete('users/:name')
async deleteUser(@Param('name') name: string) {
  await this.userService.deleteUser(name);
}

Form-urlencoded 提交

Form 是formdata,也就是把跟 Query 一样的格式(urlencodoed)的参数,写到 body 里。如下:
在这里插入图片描述
本质上相比 Query 就是把参数换了个位置。

Formdata 提交

上面三种参数都有一个特点,只能传输字符串类型。

在这个限制下,有一些二进制数据(比如视频、图片等文件)需要传递就比较难搞定了。就算利用图片常用的方法——base64转码(base64 下 urlencode 已经脱敏)来转储 binary 文件,也会有浪费。

formdata 使用较复杂的格式,解决几个问题:
1、支持直接在 body 里传输二进制;
2、使用更复杂的分节符(而不是 Query 的 &),降低数据内部错误被分割的概率;
3、为了进一步降低上面的概率,每次都协商使用新的随机边界,新边界在 header 里面带上;
在这里插入图片描述
这种模式下,content type 需要设置为 multipart/form-data。
由于防误分的的边界值需要取的很长,如果传输的部分过多,data 本身又很小,就会有一定的浪费。

JSON 格式提交

Api 请求里常用这种格式。

只要告诉对端 content type 是 application/json ,并直接在 body 里写入JSON数据,对端就会在 body 里解析 JSON,获取对象。由于JSON本身也是自解析的,也就不需要 boundary 了。

Api 形式的请求一般都是比较琐碎、可能嵌套的数据结构,boundary 会用的多而本身数据不长,JSON格式相比 Query 等比较扁平化的传参方式,就显得非常适合了。

其他

以上五种基本就是绝大多数人里绝大部分的时间会遇到的http传参方式。其中 JSON 格式是比较容易拓展的方式,比如可以拓展服务器支持 YAML 格式(自定义出 application/yaml 格式写入body,并在对端写对应的解析实现) 等也是可以的。事实上这就到了 MIME 的范畴。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值