繁体   English   中英

Laravel 4 始终返回 HTTP 状态码 200

[英]Laravel 4 always returns HTTP status code 200

我在 error.php 中有以下代码,这是在我的 controller 中使用App::abort(404, $error)触发的。我的响应状态代码仍然是 200(ok)。 我尝试了各种错误代码,例如 400、403

// NotFoundException handler
App::error(function(NotFoundException $e)
{
    $default_message = 'The requested resource was not found';

    return Response::json(array(
        'error' => $e->getMessage() ?: $default_message,
    ), 404);
 });

对于仍在搜索此问题的任何人:

我在这个问题上挣扎了几个小时。 对我来说,问题是由我的一个控制器的问题引起的。

检查所有控制器并确保<?php标签前没有空格。 < ?php标签应该是文件中的第一件事。 在任何这样路由的控制器中<?php标记前面的单个空格:

Route::controller('example', 'ExampleController');

将导致所有状态代码为 200。

我相信,无论如何,您应该收到 404 响应,因此可能会发生其他事情,这是您的问题中未包含的代码的结果。

也就是说,为 404 抛出的 Exception 类是NotFoundHttpException而不是NotFoundException

由于 Laravel 4 使用 Symfony 的 HttpKernal,因此 Exception is here

您可以在此处看到App::abort()在触发 404 时抛出NotFoundHttpException的位置。

因此,您的代码应如下所示:

// NotFoundHttpException handler
App::error(function(\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e)
{
    $default_message = 'The requested resource was not found';

    return Response::json(array(
        'error' => $e->getMessage() ?: $default_message,
    ), 404);
 });

重要提示:这只会针对 404 状态触发,因为这是 NotFoundHttpException 的相应代码。 其他状态代码返回其他异常类。 要捕获所有HTTP 状态错误代码异常,请键入HttpException 的提示,如下所示:

// HttpException handler
App::error(function(\Symfony\Component\HttpKernel\Exception\HttpException $e)
{
    return Response::json(array(
        'error' => $e->getMessage(),
    ), $e-> getStatusCode());
 });

最后, 在决定返回 JSON 或 HTML 时,请考虑使用一些内容协商

该解决方案对我不起作用,因此如果有人仍在寻找答案,我认为最好将其放在这里而不是创建另一个问题。

一段时间后我也遇到了这个问题,在我的app/Exceptions/Handler.php我有:

    if ($e instanceof ModelNotFoundException) {
        if ($request->ajax()) {
            return response()
                ->json(['error' => ['No results']])
                ->header('status', 422);
        }
    }

这在我的本地环境中有效,但是,在同系环境(复制生产环境,只是为了清楚)它没有返回正确的状态代码。

再看一遍后,我开始查看 Laravel 的文档,并将调用更改为以下内容:

    return response()
        ->json(['error' => ['No results.']], 422);

这就是诀窍。 希望这能有所帮助。

就我而言,我在 <?php 前面找到了一些空间

删除dump和其他打印功能

当我注意到这个问题时,我正在积极调试。 是因为当时我在代码中调用了dump(...)

当我删除所有调试dump调用时,状态代码再次正确为404 (使用abort(404 ))。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM