用 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 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 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年前 评论

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