一尘不染

在控制器中呈现JSON

json

我正在阅读一本书,并在有关控制器的一章中谈到渲染的内容,对于JSON,它有一个类似这样的示例,但没有详细介绍,因此我无法弄清楚该示例所适合的整体情况:

render :json => @projects, :include => tasks

还有使用JSONP和回调函数的示例:

render :json => @record, :callback => 'updateRecordDisplay'

有人可以解释这些吗?


阅读 243

收藏
2020-07-27

共1个答案

一尘不染

通常,您将返回JSON的原因之一是:

A)您正在将部分/全部应用程序构建为单页应用程序(SPA),并且需要客户端JavaScript能够提取其他数据而无需完全重新加载页面。

要么

B)您正在构建供第三方使用的API,并且您已决定使用JSON序列化数据。

或者,也许,你是吃自己的狗食和做 两个

在这两种情况下,render :json => some_data都将对提供的数据进行JSON验证。:callback第二个示例中的键需要更多说明(请参阅下文),但这是同一想法的另一种变体(以JavaScript可以轻松处理的方式返回数据)。

为什么:callback

JSONP(第二个示例)是一种绕过相同起源策略的方法,该策略是每个浏览器内置安全性的一部分。如果你有你的API
api.yoursite.com,您将服务应用程序关闭的services.yoursite.com您的JavaScript不会(默认情况下)能够使XMLHttpRequest(XHR
-又名AJAX)从请求servicesapi。人们绕过该限制的方式(在跨域资源共享规范最终确定之前)是通过从服务器发送JSON数据, 就好像它是JavaScript而不是JSON一样
。因此,与其发回:

{"name": "John", "age": 45}

服务器将发送回:

valueOfCallbackHere({"name": "John", "age": 45})

因此,客户端JS应用程序可以创建一个script指向的标签,api.yoursite.com/your/endpoint?name=John并具有该valueOfCallbackHere功能(必须在客户端JS中定义),
并使用其他来源的数据进行 调用。)

2020-07-27