响应::json()发送html而不是json


Response::json() sending html instead of json

使用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文件里。