Laravel 4 为什么在发送 JSON 时发送内容类型


laravel 4 why send content-type when sending json?

在我读过的 laravel 的书中,也有 laravel 经验的同事说,生成 JSON 我应该以 laravel 的方式。

为什么我需要这样做:

Route::get('markdown/response', function()
{
    $data = array('iron', 'man', 'rocks');
    return Response::json($data);
});

当我读到它时,使用它时还会发送内容类型标头。

当我使用代码点火器时,我曾经简单地这样做:

echo json_endode($data);

从来没有遇到过任何问题。即使它不是设置内容类型。实际上我不知道php是否会自动设置它,但是由于我没有问题,所以我不在乎。

在使用"新"技术时,我真的很想知道为什么它比好的旧技术更好。

恕我直言,由于没有提供content-type标头,您在CodeIgniter中编码时做得"错误"。

大多数客户端(浏览器,ajax请求,尤其是jQuery)仍然可以猜测如何正确处理响应,因此可能"只是为您工作"。您可能总是隐式返回带有响应的Content-Type: text/html,这是 CodeIgniter 中的默认标头。

始终随 HTTP 响应一起返回正确的内容类型,以便使用客户端知道如何处理此内容。请注意,这是规范中定义的HTTP机制,不特定于任何框架甚至语言。

Response::json()

上面的代码只是一个方便的功能,Laravel会自动为您设置application/json标头,并将数据数组转换为JSON格式。正如您所指出的,与CodeIgniter代码的唯一有效区别是标头的设置。

值得注意的是,响应对象扩展了Symfony的响应对象,这是非常"强大"的 - 换句话说,它是HTTP协议的一个非常好的实现。

Response::json(和其他Response静态方法)返回的响应对象是高度可修改的。

$response = Response::json($data);
$response->header('Content-Type', 'application/json');
return $response;

您可以在Laravel和Symfony代码API中查看更多可用的方法。

http://laravel.com/api/class-Illuminate.Http.Response.htmlhttp://api.symfony.com/2.1/Symfony/Component/HttpFoundation/Response.html

仅仅因为它有效并不意味着它没有错。JSON 不是 HTML,所以text/html是不准确的Content-Type

发送正确的标头意味着像jQuery这样的库了解它们返回的数据类型,因此能够在没有指导的情况下自行处理它。浏览器还可以做一些事情,比如漂亮地打印JSON数据或使其更易于阅读。

取决于您尝试对路由执行的操作。 如果你只想返回 JSON 数据,你可以只返回 json_encode($data) 这将起作用, 要实际返回 json 响应以用于 ajax 请求之类的东西,您需要正确设置标头,或者接受路由只是认为它得到了一个字符串。响应::json用于设置适当设置标头的响应。