Laravel响应状态代码设置为400但浏览器报告200

时间:2014-04-02 20:11:04

标签: backbone.js laravel laravel-4 http-headers http-status-codes

我试图从Laravel返回400状态代码。我在我的控制器中设置了一个简单的测试:

return Response::json(["Test", "Array"], 400);

看看网络检查员我得到200 OK。

如果我转储回复:

object(Illuminate\Http\JsonResponse)#306 (8) {
  ["data":protected]=>
  string(16) "["Test","Array"]"
  ["callback":protected]=>
  NULL
  ["headers"]=>
  object(Symfony\Component\HttpFoundation\ResponseHeaderBag)#315 (5) {
   ["computedCacheControl":protected]=>
    array(1) {
      ["no-cache"]=>
      bool(true)
    }
    ["cookies":protected]=>
    array(0) {
    }
    ["headerNames":protected]=>
    array(3) {
      ["cache-control"]=>
      string(13) "Cache-Control"
      ["date"]=>
      string(4) "Date"
      ["content-type"]=>
      string(12) "Content-Type"
    }
    ["headers":protected]=>
    array(3) {
      ["cache-control"]=>
      array(1) {
        [0]=>
        string(8) "no-cache"
      }
      ["date"]=>
      array(1) {
        [0]=>
        string(29) "Wed, 02 Apr 2014 20:03:14 GMT"
      }
      ["content-type"]=>
      array(1) {
        [0]=>
        string(16) "application/json"
      }
    }
    ["cacheControl":protected]=>
    array(0) {
    }
  }
  ["content":protected]=>
  string(16) "["Test","Array"]"
  ["version":protected]=>
  string(3) "1.0"
  ["statusCode":protected]=>
  int(400)
  ["statusText":protected]=>
  string(11) "Bad Request"
  ["charset":protected]=>
  NULL
}

我可以看到状态代码设置为400,statusText是错误请求。

基本上我将Backbone.js与Laravel结合使用,需要返回200以外的状态代码来捕获保存时的错误。

这看起来很简单,有谁知道我有这个问题?

更新

经过一番抨击后,我发现了一个(不太理想)的工作来实现我的需要,并在Laravel GitHub上记录了一个问题:https://github.com/laravel/laravel/issues/2796

基本上我把我的控制器从等式中取出并尝试将其作为路线:

Route::get('/bad-request', function() {
    $response['state'] = "error";
    $response['errors'] = ["name" => ["A product name is required"]];

    return Response::json($response, 400);
});

同样的问题,返回200.暂时找到这个工作:

Route::get('/bad-request', function() {
    $response['state'] = "error";
    $response['errors'] = ["name" => ["A product name is required"]];

    http_response_code(400);
    return Response::json($response, 400);
});

我宁愿用Laravel做这件事而不是用PHP强迫它。我也试过了Response::make,这完全是一样的。

2 个答案:

答案 0 :(得分:0)

我最近自己遇到了这个问题,它应该可以工作,但由于某些原因它没有。您需要自己制作响应对象。

Response::make(["Test", "Array"], 400);

由于某种原因,这仍然会自动将数组作为JSON返回...

答案 1 :(得分:0)

这对我有用:

new Response(Array,400); //will return 400

虽然api会告诉你,但这不起作用:

new Response()->json(Array,400); // will return 200
new Response()->make(Array,400); // will return 200