用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

解决方法三:

感谢 Laravel China 论坛回复里提出的直接用 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 这个方法来进行序列化。