Response :: json()发送html而不是json

时间:2014-09-17 11:50:20

标签: php ajax json laravel content-type

使用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代码中打印某些内容)?

1 个答案:

答案 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;

希望它有所帮助...