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

z9zf31ra  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(173)

使用Laravel 4,在一个控制器中使用的return Response::json(array('foo' => 'bar'))将返回实际的application/json,而在另一个控制器中,对于另一个操作,它将返回text/html
faulty控制器中,我尝试使用以下代码段强制content-type:

[...]

$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?为什么mock头不在收到的响应中?

--编辑--

问题似乎出在验证器周围。

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代码中打印一些东西)吗?

7eumitmz

7eumitmz1#

基本上使用Response::json()和一个数据数组作为参数就足够了。再次定义Content-type头是没有用的,Response::json应该在默认情况下设置正确。
我现在正在我的项目上创建json响应,到目前为止一切都很顺利。只是为了澄清错误的控制器返回了一个带有错误内容类型头的好值,对吗?你能只使用Response::json再试一次吗?你能告诉我你使用的是哪个确切的laravel版本吗?
再次嗨我编辑我的第一个答案的基础上你的回复:你应该做这样的测试
$json = json编码($你的数组);
//首先用var_dump()或Log::info()检查$json变量,看看是否有空间问题,然后创建响应。
$response =响应::制造商($json,200);
$response-〉头文件('内容类型','应用程序/json');
返回$响应;
希望能有所帮助...

r6vfmomb

r6vfmomb2#

OP的情况可能不是这样,但对于以text/html发送的json响应来说,这是最好的搜索结果,我刚刚花了相当多的时间在Laravel 9中用php 8. 2调试这个问题
内容类型错误的一个可能原因隐藏在php magic goo中,换句话说,它是如何处理发送响应头的。
如果你在php开始或结束标签前后有空格,那么头文件将被发送,你不能再修改它们。这就是为什么建议不要在多文件应用程序中使用php结束标签,但这对开始标签前的空格没有帮助:

<?php

现在,如果您的框架(如Laravel)在为您修改头文件之前检查headers_sent(),则结果是击鼓:text/html,没有任何错误。
要找出问题所在,请尝试使用header()在调用堆栈末尾的某个位置设置头文件,然后它应该会失败,并告诉您头文件已经发送到哪个文件中,对我来说,问题隐藏在一个lang文件中。

相关问题