【发布时间】:2014-11-11 10:40:08
【问题描述】:
使用 Laravel 4,在一个控制器中使用 return Response::json(array('foo' => 'bar')) 将返回实际的 application/json,而在另一个控制器中,对于另一个操作,它将返回 text/html。这两个动作都是通过 Ajax 调用的。
在faulty controller中,我尝试用这个sn-p强制内容类型:
[...]
$response = Response::json($data);
$response->header('Content-Type', 'application/json');
$response->header('Content-Foo', 'Bar'); // test if additional headers are really set
Log::info($response);
return $response;
...而 工作控制器 返回正确的 Json 响应:
return Response::json($data);
在两者中,$data 都是一个数组(经过测试)。
记录的响应来自故障控制器:
HTTP/1.0 200 OK
Cache-Control: no-cache
Content-Foo: Bar
Content-Type: application/json
Date: Wed, 17 Sep 2014 10:55:03 GMT
但收到的响应(在 Firebug / DevTools 中)是:
Connection Keep-Alive
Content-Type text/html
Date Wed, 17 Sep 2014 10:55:03 GMT
Keep-Alive timeout=5, max=93
Server Apache/2.2.25 (Unix) mod_ssl/2.2.25 OpenSSL/0.9.8y DAV/2 PHP/5.5.3
Transfer-Encoding chunked
X-Powered-By PHP/5.5.3
我尝试在错误的控制器操作开始时直接返回Response::json(array('foo' => 'bar')),但它仍然以text/html 发送响应。
我想知道为什么内容类型会无缘无故地从application/json 切换到text/html?为什么收到的响应中没有模拟标头?
-- 编辑--
问题似乎出在验证器周围。
public function faultyAction()
{
if(!Request::ajax()) App::abort(405);
$validator = Validator::make(
array('trackfile' => Input::file('trackfile')),
array('trackfile' => 'required|audio')); // audio is a custom validator
if($validator->fails())
{
Log::info('validation failed!');
return Response::json(array('code' => 1, 'message' => 'File validation has failed.'));
}
else
{
Log::info('validation passed!');
return Response::json(array('code' => 0, 'filename' => 'test'));
}
}
...在验证通过时返回text/html响应。
public function faultyAction()
{
if(!Request::ajax()) App::abort(405);
$validator = Validator::make(
array('trackfile' => Input::file('trackfile')),
array('trackfile' => 'required|audio')); // audio is a custom validator
return Response::json(array('code' => 0, 'filename' => 'test'));
}
...返回application/json。
如何根据在代码中调用的位置返回具有不同内容类型的相同响应?
它可能来自$validator->fails()(即使似乎没有改变标题或在 Laravel 的Validator.php 代码中打印某些内容)?
【问题讨论】:
-
您是否在某处显示了请求的响应?如果您有错误,则可能会显示错误而不是您的期望。在这种情况下,PHP 将 Content-Type 标头覆盖为 text/html
-
请重新检查您提供给故障控制器的 $data 内容。
-
@Maskime 这是一个 XHR,所以我在 Firebug 中得到了响应。在将响应发送回之前,我在 Laravel 中记录它,然后在 Firebug 中得到它(参见两个响应)。 @justrohu 我用 $data 替换了我的原始数据以供阅读,但是实际的数据数组是原始传递给
Response::json()所以我认为问题不在于这个。 -
我编辑了帖子,添加了新信息和测试。
-
在控制器中返回响应对象之前测试内容类型。如果没问题,这意味着在返回后发生了一些变化,可能是您的 routes.php 中针对该路由的后过滤器。
标签: php ajax json laravel content-type