推荐软件
推荐一款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 的范畴。