用 Laravel 开发 API 时遇到的一个小坑
这几天开发 API 开始都好好的,Laravel5.5 提供的 make:resource
用的也挺方便的,转换层不用下载其他包了。但是当我开发完几个 get、post 路由,再开发 patch 和 put 路由时发现在 postman 里面怎么测试都报错。
后来查了好多资料才发现
form-data 不支持 put 和 patch !!
然后我的postman一直是使用form-data来测试接口的
原来如此。。。
接下来就是找解决办法
解决方法一:
使用 postman 的 form-data 传过去是不行的,用 x-www-form-urlencoded 就可以了。
所以 ajax 传数据的时候不能直接传 form-data 数据,要传键值对序列化过去。
解决方法二:
不过还有一种解决办法,Laravel 提供了用 post 模拟 put 和 patch 的方法,就是你依然可以使用 post 请求 和用 form-data 传数据,但是你要在 form-data 里再加一行数据,其中 key 是 _method , value 是 PUT 或者 PATCH 。这样 Laravel 的 put 和 patch 路由依然会正确解析你的 post 请求。
解决方法三:
感谢 @medz 提出的直接用 Content-Type: application/json
这个 Headers
传数据, 我在 postman 里试了一下确实可以。而且查了一下资料,加这个 Headers
确实是一个比较通用且较好的方法,详情可以见 四种常见的 POST 提交数据方式
在 postman 里面测试接口的话就选择用 raw
传 application/json
格式就可以了
然后 postman 会自动把 Headers 改为 Content-Type:application/json
这样前端开发使用 patch 或者 put 路由的时候,只要把数据 JSON 序列化之后传过来就可以了。一般是使用 JSON.stringify
这个方法来进行序列化。
我的博客 漂游记
本作品采用《CC 协议》,转载必须注明作者和本文链接
Content-Type: application/json
是更好的选择。@medz 谢谢,我试了一下确实可以。
@Robinson 我们这边在 API 中,除了上传文件的地方,提交都是尽量以 json 数据进行上报的。
@medz 恩
既然是api 当然用x-www-form-urlencoded形式,否则不是浏览器在使用
@颜⑧ 不过
application/json
可以传输数据层次比较深一点的结构化数据, 像{"name":"ttt","address":{"province":"ZJ","city":"HZ"}}
很多服务器的防火墙,其实是不允许使用PUT和DELETE的,所以尽量使用POST和GET,毕竟PUT方法是可以往服务器放文件的,而DELETE是可以删除服务器文件的,这两个命令存在一定的风险