使用Laravel 4,一个控制器中使用的return Response::json(array('foo' => 'bar'))
将返回实际的application/json
,而在另一个控制器中,对于另一个操作,它将返回text/html
。这两个动作都是通过Ajax调用的。
在故障控制器中,我尝试使用此代码段强制使用内容类型:
[...]
$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
代码中打印某些内容)?
答案 0 :(得分:0)
嗨基本上使用带有数据数组的Response :: json()作为参数就足够了。 再次定义Content-type标头是没用的,Response :: json应该默认设置为正确。
我现在正在我的项目上创建json响应,到目前为止一切正常。 只是要明确错误的控制器返回错误的内容类型标题的好值,对吧? 你能再次使用Response :: json再试一次吗?你能告诉你使用哪种精确的laravel版本吗?
您好我再次根据您的回复编辑我的第一个答案: 你应该测试这样的东西:
$ json = json_encode($ yourArray);
//首先用var_dump()oro Log :: info()检查$ json变量,看看是否有空间问题。然后你可以创建响应。
$ response = Response :: make($ json,200);
$ response->标题('内容类型',' application / json');
返回$ response;
希望它有所帮助...