使用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'));
}
返回CCD_ 10。
如何根据代码中调用的位置,用不同的内容类型返回相同的响应
它可能来自$validator->fails()
吗(即使似乎没有任何东西改变标题或打印Laravel的Validator.php
代码中的内容)?
Hi基本上使用Response::json()和一个数据数组作为参数就足够了。再次定义Content-type头是无用的,默认情况下,Response::json应该设置正确。
我现在正在我的项目上创建json响应,到目前为止一切顺利。为了清楚起见,有故障的控制器返回了具有错误内容类型标头的良好值,对吧?你能只使用Response::json再试一次吗?你能说出你使用的是哪个确切的laravel版本吗?
大家好,我正在根据您的回复编辑我的第一个答案:你应该测试这样的东西:
$json=json_encode($yourArray);
//首先用var_dump()oro-Log::info()检查$json变量,看看是否存在空间问题。然后您可以创建响应。
$response=响应::make($json,200);
$response->header('Content-Type','application/json');
return$response;
希望它能帮助。。。
OP可能不是这样,但这是以text/html/strong>形式发送的json响应的最佳搜索结果。我只是花了相当多的时间在Laravel 9中用php 8.2 调试这个问题
错误内容类型的一个可能原因隐藏在phpmagicgoo的某个地方。换句话说,它是如何处理发送响应头的。
如果在php打开或关闭标记之前或之后的任何位置都有空白,则会发送标头,并且您不能再修改它们。这就是为什么建议在多文件应用程序中不要使用php关闭标记,但这对打开标记之前的空白没有帮助:
<?php
现在,如果您的框架,如Laravel,在为您修改头之前,先检查headers_sent()
,结果是drum-roll:text.html,任何地方都没有错误。
要确定问题,请尝试自己使用header()
在调用堆栈末尾的某个位置设置头。然后它会失败,并告诉您已经在哪个文件中发送了标头。对我来说,罪魁祸首藏在一个lang文件里。