我在error.php中有以下代码,这是在我的控制器中使用App::abort(404, $error)
触发的。我的响应状态代码仍为200(确定)。我试过各种错误代码,如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);
});
答案 0 :(得分:7)
对于仍然在Google上搜索此问题的人:
我几个小时都在努力解决这个问题。对我来说,问题是由我的一个控制器出现问题引起的。
检查所有控制器并确保<?php
标记前面没有空格。 &lt; ?php
标记应该是文件中的第一件事。任何控制器中<?php
标记前面的单个空格,如下所示:
Route::controller('example', 'ExampleController');
将导致所有状态代码为200。
答案 1 :(得分:6)
我相信,无论如何,您应该收到404回复,因此可能会发生其他问题,这是因为您的问题中未包含代码。
话虽如此,为404抛出的Exception类是NotFoundHttpException
而不是NotFoundException
。
由于Laravel 4使用Symfony的HttpKernal,因此异常为here。
当触发404时,您可以看到here其中App::abort()
引发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());
});
最后,请考虑using a bit of Content Negotiation when deciding to return JSON or HTML。
答案 2 :(得分:0)
解决方案对我不起作用,所以如果有人还在寻找答案,我认为最好把它放在这里,而不是创建另一个问题。
过了一段时间我也遇到了这个问题,在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);
这就是诀窍。希望这可以提供帮助。
答案 3 :(得分:0)
就我而言,我在<?php
前面发现了一些空间