2

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

为什么我需要这样做:

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

正如我所读到的,它在使用它时也会发送内容类型标头。

当我使用 codeigniter 时,我曾经这样做过:

echo json_endode($data);

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

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

4

4 回答 4

4

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.html http://api.symfony.com/2.1/Symfony/Component/HttpFoundation/Response.html

于 2013-10-26T13:33:05.403 回答
4

恕我直言,通过不提供content-type标头,您在 CodeIgniter 中编码时做的“错误”。

大多数客户端(浏览器、ajax 请求,尤其是 jQuery)仍然可以猜测如何正确处理响应,因此可能对您“刚刚工作”。您可能总是隐含地返回 aContent-Type: text/html和您的响应,这是 CodeIgniter 中的默认标头。

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

Response::json()

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

值得注意的是,Response 对象扩展了 Symfony 的 response 对象,非常“强大”——换句话说,它是 HTTP 协议的一个非常好的实现。

于 2013-10-26T16:36:27.297 回答
2

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

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

于 2013-10-26T16:42:42.893 回答
0

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

于 2013-10-26T13:32:20.887 回答