近期尝试使用 nod.js + vue 开发一个小项目。
第一次使用 postman 测试,遇到 POST 请求数据发送不过去的问题,做一个记录。
JS 部分代码
//用户注册接口
router.post('/register', function (req, res, next) {//验证if (1===1) {//console.log(req.body);res.json({status: 1, message: '用户名不能为空' + req.body.username});}
});
Postman测试
由于是第一次使用,开始测试过几个 GET 请求,一切测试正常。
测试 POST 请求时,只是简单的将请求类型改为了 “POST”。如图:
发现传递到请求中的 username 值为 undefined。
也就是说传值失败了 …
补充一下: 之前记录这篇文章时对 POST 传参方式,仅限于日常项目中所见,故存在一点误解,后来了解过一点这方面知识之后,反而忘记了这篇文章,直到最近翻看到时才发现,所以做一点补充与更正,如之前有误导各位读者,敬请原谅。后来研究了半天,发现了 URL 的奇怪之处。
POST 请求的参数不是不应该出现在 URL 中么?
此处需要更正一点:
POST 请求的参数并非不能出现在 URL 中,仅仅是因为我们经常将其放在 body 中传输。
实际上,不论是 GET 请求还是 POST 请求,传参的方式都既可以放在 url 中也可以放在 body 中
只不过大多数 POST 请求的参数通过 body 传递参数,也有少部分 POST 请求通过 url 传递参数,其能否传参成功还取决于后台代码对于参数的接收要求,如 Java 中的 @RequestParam 和 @RequestBody 在这里就分别意味着从 url 中取参和从 body 中取参;同样,C# 中也有 FromUrl 和 FromBody 来标记接收参数的方式。
另外,有一点不同的是 GET 请求,常见的 GET 请求 99% 都是通过 URL 传参的,但并没有规定 GET 请求不可以通过 body 传参,只能说 GET 请求通过 body 传参的方式是不被推荐的,以至于市面上部分框架和软件并不支持 GET 请求通过 body 方式传参(也可能暂时不支持,后期会支持),比如著名的接口测试工具 Postman 的上一个版本(Postman 最新版本已经支持,但上个版本是不支持的),OkHttpClient 框架(java.lang.IllegalArgumentException: method GET must not have a request body) ,当然也有很多框架和软件是支持的,比如典型的 Spring 框架等。
正因为如此,为了保证代码的稳定性、兼容性和可移植性,我们目前强烈建议除非特殊需求特殊场景下,尽量避免 GET 请求通过 body 方式传参的方式。
于是,考虑到可能是只修改了 POST 的 URL 请求类型,而没有修改传参方式。
发现,Postman 还提供了很多可选项的。
Params:参数。会直接出现在 url 中,一般为 GET 请求的参数。
Authorization:认证。当 HTTP 请求目标端设置了访问权限过滤或者请求拦截时需要配置这里。
Headers:请求头信息。传递客户端的一些信息。这里的 Content-Type 与后面 body 的类型相关。
Body:请求体。分表单提交、文件提交、JSON提交等多种方式form-data:表单提交。相当于 html 的 form 标签中 multipart/form-data。可以上传文件、键值对等
x-www-form-urlencoded:表单提交。相当于 html 中 form 标签中 application/x-www-from-urlencoded。上传表单时会自动转换为键值对提交。
raw:文本提交。可以选择 XML、JSON、TEXT、HTML 等。
binary:二进制文件提交。通常用来上传文件、图片等。