用 Laravel 开发 API 时遇到的一个小坑

这几天开发 API 开始都好好的,Laravel5.5 提供的 make:resource 用的也挺方便的,转换层不用下载其他包了。但是当我开发完几个 get、post 路由,再开发 patch 和 put 路由时发现在 postman 里面怎么测试都报错。

2018-02-05-21-41-08-201825

后来查了好多资料才发现

form-data 不支持 put 和 patch !!

然后我的postman一直是使用form-data来测试接口的

原来如此。。。

接下来就是找解决办法

解决方法一:

使用 postman 的 form-data 传过去是不行的,用 x-www-form-urlencoded 就可以了。

2018-02-05-21-43-23-201825

所以 ajax 传数据的时候不能直接传 form-data 数据,要传键值对序列化过去。

解决方法二:

不过还有一种解决办法,Laravel 提供了用 post 模拟 put 和 patch 的方法,就是你依然可以使用 post 请求 和用 form-data 传数据,但是你要在 form-data 里再加一行数据,其中 key 是 _method , value 是 PUT 或者 PATCH 。这样 Laravel 的 put 和 patch 路由依然会正确解析你的 post 请求。

2018-02-05-21-47-15-201825

解决方法三:

感谢 @medz 提出的直接用 Content-Type: application/json 这个 Headers 传数据, 我在 postman 里试了一下确实可以。而且查了一下资料,加这个 Headers 确实是一个比较通用且较好的方法,详情可以见 四种常见的 POST 提交数据方式

在 postman 里面测试接口的话就选择用 rawapplication/json 格式就可以了
2018-02-06-17-09-01-201826

然后 postman 会自动把 Headers 改为 Content-Type:application/json

2018-02-06-17-11-34-201826

这样前端开发使用 patch 或者 put 路由的时候,只要把数据 JSON 序列化之后传过来就可以了。一般是使用 JSON.stringify 这个方法来进行序列化。


我的博客 漂游记

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 7
medz

Content-Type: application/json 是更好的选择。

6年前 评论

@medz 谢谢,我试了一下确实可以。

6年前 评论
medz

@Robinson 我们这边在 API 中,除了上传文件的地方,提交都是尽量以 json 数据进行上报的。

6年前 评论
Show 4年前
medz (作者) 4年前
颜⑧

既然是api 当然用x-www-form-urlencoded形式,否则不是浏览器在使用

6年前 评论

@颜⑧ 不过 application/json 可以传输数据层次比较深一点的结构化数据, 像 {"name":"ttt","address":{"province":"ZJ","city":"HZ"}}

6年前 评论

很多服务器的防火墙,其实是不允许使用PUT和DELETE的,所以尽量使用POST和GET,毕竟PUT方法是可以往服务器放文件的,而DELETE是可以删除服务器文件的,这两个命令存在一定的风险

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!