Laravel 强制 json 响应 api
Posted
技术标签:
【中文标题】Laravel 强制 json 响应 api【英文标题】:Laravel forcing json response for api 【发布时间】:2018-09-15 20:13:49 【问题描述】:我正在我的公司使用 laravel 构建一个 api。
我遇到的问题是,如果您发送 api 请求而没有为请求定义正确的标头,如果出现故障,您将返回 html,例如授权失败或findOrFail()
失败。
我的想法是你永远不想返回 html(即使用户有错误的标题)。
我有几个解决方案。在BeforeMiddleware.php
中,我可以手动将标头插入到请求中,例如:
// Check if we are on an api route
$apiRoute = strncmp($uri, '/api/', 5) == 0;
// Insert the request header to force json response
if ($apiRoute)
$language = $request->header->add('Accept', 'application/json');
第二种解决方案是,如果它们没有正确的标题,则抛出错误。
强制执行 json 响应的最佳方式是什么,在 laravel 中处理 api 响应的良好做法是什么?
【问题讨论】:
这个问题中提出的类似问题***.com/questions/36366727/… 浏览器会在接受标头中告诉您他们接受的内容。如果浏览器不接受 JSON,那么给它 JSON 有什么意义? 通过$apiRoute = $request->segment(1) == 'api';
之类的操作也可能更容易检查 api 路由
@apokryfos 你能详细说明一下吗? '浏览器会让你知道'是什么意思。我可以在 laravel 中设置一个设置来说明它接受的内容吗?
请求接受头由客户端设置。作为服务器,您应该尊重客户端发送的内容。如果这是为了调试,您可以使用 postman 之类的东西并从那里正确发送标头或实施一些单元测试。
【参考方案1】:
一旦你检测到你在你的 api 路径上,你就走出了困境,并且确实可以在 app\Exceptions\Handler.php 文件中解决你的问题,就像How do you force a JSON response on every response in Laravel? 上的建议一样。
对于一个开源项目,我通过 Microsoft 格式创建了 JSON 异常对象作为输出,但您可以根据需要选择 jsonapi 格式(http://jsonapi.org/examples/#error-objects-basics): https://github.com/StadGent/laravel_site_opening-hours/blob/develop/app/Exceptions/Handler.php (请注意,在此实现中,它确实取决于标头,但我认为您可以使用路径检测)
【讨论】:
以上是关于Laravel 强制 json 响应 api的主要内容,如果未能解决你的问题,请参考以下文章