当前位置: 首页 > 知识库问答 >
问题:

如何在Laravel中的每个响应上强制执行JSON响应?

刘乐童
2023-03-14

我正在尝试使用Laravel框架构建REST api,我想要一种强制api始终使用JSON响应的方法,而不是手动执行以下操作:

return Response::json($data);

换句话说,我希望每个响应都是JSON。有什么好办法吗?

更新:响应必须是JSON,即使在异常(如not found exception)上也是如此。

共有3个答案

孔安阳
2023-03-14

我知道这已经得到了回答,但这些都不是好的解决方案,因为它们会以不可预知的方式更改状态代码。最好的解决方案是添加适当的头,以便Laravel返回JSON(我认为它的Accept:application/JSON),或者按照这个很棒的教程始终告诉Laravel返回JSON:https://hackernoon.com/always-return-json-with-laravel-api-870c46c5efb2

如果您想更具选择性或适应更复杂的解决方案,您也可以通过中间件来实现这一点。

司雅畅
2023-03-14

要在控制器中返回JSON,只需返回$data

要获得关于错误的JSON响应,请转到app\Exceptions\Handler.php文件并查看渲染方法。

您应该能够重新编写它,使其看起来像这样:

public function render($request, Exception $e)
{
    // turn $e into an array.
    // this is sending status code of 500
    // get headers from $request.
    return response()->json($e, 500);
}

但是,您必须决定如何使用$e,因为它需要是一个数组。您还可以设置状态代码和标头数组。

但是如果出现任何错误,它将返回一个JSON响应。

编辑:同样值得注意的是,您可以更改Report方法来处理laravel记录错误的方式。更多信息在这里。

阙奇思
2023-03-14

按照Alexander Lichter的建议创建一个中间件,在每个请求上设置Accept头:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class ForceJsonResponse
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $request->headers->set('Accept', 'application/json');

        return $next($request);
    }
}

将其添加app/Http/Kernel中的$routeMiddleware。php文件:

protected $routeMiddleware = [
    (...)
    'json.response' => \App\Http\Middleware\ForceJsonResponse::class,
];

现在可以包装所有应返回JSON的路由:

Route::group(['middleware' => ['json.response']], function () { ... });

给出json。响应中间件优先于其他中间件-在设置接受头之前,处理请求被其他中间件(如授权中间件)终止的情况。

为此,请使用以下命令覆盖App\Http\Kernel类(App/Http/Kernel.php)的构造函数:

    public function __construct( Application $app, Router $router ) {
        parent::__construct( $app, $router );
        $this->prependToMiddlewarePriority(\App\Http\Middleware\ForceJsonResponse::class);
    }
 类似资料:
  • 问题内容: 我们正在对所有的Ajax请求处理都使用Prototype,为了使事情变得简单,我们简单地渲染HTML内容,然后使用以下函数将其分配给适当的div: 但是,有时我需要在HTML响应中执行Javascript,而此方法似乎无法执行此操作。 由于种种原因,我试图将Ajax调用的功能列表保持在最低限度,因此,如果有一种方法可以修改现有功能而又不会破坏当前正在使用的所有位置,或者可以通过一种方式

  • 我有一个严重的问题与Livewire从api响应传递数据到组件刀片文件。起初它加载良好,当我点击的时候。下拉列表会在下面抛出一个错误。 Livewire在尝试为[sign up]组件添加水合物时遇到损坏的数据。确保Livewire组件的[名称、id、数据]在请求之间未被篡改。 我有一个我正在加载的下拉列表,一开始它加载得很好,但当我从下拉列表中选择某个内容时,它抛出了那个错误。 下面是我的组件代码

  • 我试图创建API与laravel护照认证现在它是很容易使API与laravel护照。我使用个人访问令牌为API用户创建访问令牌。因为我的客户端和服务器都是一个,但是当API中没有提供令牌时,它重定向到由laravel auth scaffold创建的登录页面,我想返回带有消息令牌未提供的json响应。 https://laravel.com/docs/5.4/passport#personal-访

  • 问题内容: 我正在发送一个带有2个post值的ajax请求,第一个是“ action”,它定义了我的php脚本必须解析的动作,另一个是“ id”,它是要为其解析脚本的用户的ID。 服务器在array()中返回6个值,然后使用PHP函数将其编码为JSON: 我的一些响应为HTML,但是当我将其编码为JSON时,它会转义,因此 如何禁用它? 当我不知道如何在获得服务器响应时在jQuery中显示此消息时

  • 问题内容: 我正在编辑内置的表单。 我在对话框中显示该表单,然后提交。 数据已正确输入数据库。 但是我不知道是否需要将一些寄回。其实我对事情有点困惑。 假设我在表中使用``jQuery添加了一行,当我提交表单时,然后在提交数据之后,我想发回那些行数据,以便我可以动态添加表行以显示添加的数据。 我很困惑如何获取这些数据。 这是我当前的代码: 这只是带有成功消息的模板。 问题答案: Symfony 2

  • Spring Boot Actuator的在捕获输入/输出HTTP参数、标头、用户等方面做得很好。我想扩展它以也捕获HTTP响应的主体,这样我就可以全面了解Web层的进出情况。查看,看起来没有一种方法可以配置响应主体捕获。是否有一种“安全”的方法可以捕获响应主体而不会弄乱它发送回的任何字符流?