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的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 Laravel API 始终返回 JSON,不重定向

Laravel 响应::json 失败

Laravel:用 UTF-8 编码 JSON 响应

Laravel 4 返回 json 作为响应

使用自定义 json 响应进行 Laravel 验证

Laravel 中的 JSON 响应