我正在阅读一本书,并在有关控制器的一章中谈到渲染的内容,对于JSON,它有一个类似这样的示例,但没有详细介绍,因此我无法弄清楚该示例所适合的整体情况:
render :json => @projects, :include => tasks
还有使用JSONP和回调函数的示例:
render :json => @record, :callback => 'updateRecordDisplay'
有人可以解释这些吗?
通常,您将返回JSON的原因之一是:
A)您正在将部分/全部应用程序构建为单页应用程序(SPA),并且需要客户端JavaScript能够提取其他数据而无需完全重新加载页面。
要么
B)您正在构建供第三方使用的API,并且您已决定使用JSON序列化数据。
或者,也许,你是吃自己的狗食和做 两个
在这两种情况下,render :json => some_data都将对提供的数据进行JSON验证。:callback第二个示例中的键需要更多说明(请参阅下文),但这是同一想法的另一种变体(以JavaScript可以轻松处理的方式返回数据)。
render :json => some_data
:callback
JSONP(第二个示例)是一种绕过相同起源策略的方法,该策略是每个浏览器内置安全性的一部分。如果你有你的API api.yoursite.com,您将服务应用程序关闭的services.yoursite.com您的JavaScript不会(默认情况下)能够使XMLHttpRequest(XHR -又名AJAX)从请求services到api。人们绕过该限制的方式(在跨域资源共享规范最终确定之前)是通过从服务器发送JSON数据, 就好像它是JavaScript而不是JSON一样 。因此,与其发回:
api.yoursite.com
services.yoursite.com
XMLHttpRequest
services
api
{"name": "John", "age": 45}
服务器将发送回:
valueOfCallbackHere({"name": "John", "age": 45})
因此,客户端JS应用程序可以创建一个script指向的标签,api.yoursite.com/your/endpoint?name=John并具有该valueOfCallbackHere功能(必须在客户端JS中定义), 并使用其他来源的数据进行 调用。)
script
api.yoursite.com/your/endpoint?name=John
valueOfCallbackHere