用Rails实践JSON-P的输出最近的
Web Directions 06 会议上,Cameron Adam和Sitepoint网站的Kevin Yank在
Mashups和APIs的演讲中,提到了JSON-P。
JSON-P是一个包装了允许别的开发者在他们的页面里绕过
浏览器的安全机制来调用你的JSON输出API的方法。
如果看一下
Web Connections这个网站的HTML源码,你会发现里面使用了JSON-P来映射JS数据。在调用JSON-P里的URL我们可以指定
variable,
callback参数,或者同时指定二个,这就使别人可以在他们自己的mashups中使用我们的JSON。
JSON-P也很好地整合了新的Rails REST功能,如
Jeremy Keith’s profile page(译者注:”
http://connections.webdirections.org/people/37“)在JSON格式中可以输出为
plugging ‘.js’ on the end(译者注:“
http://connections.webdirections.org/people/37.js”)
以‘.js’为结束的格式,这虽然好,但是如果你想从别的页面里调用就没有什么作用。
话说Jeremy想mashup一个数据到他的网站然后展示出谁是他的朋友,他需要JSON-P的某种输出,以便从
script标签中访问的数据。
为了增加JSON-P“Padding”,就正好指定一个“Variable”参数,这个参数是用来声明你要分配给
Javascript变量的名字。在这个例子中我们将
指定‘'variable = personJSON’。.注意到输出中的分别没有? 现在试着指定
callback,或者
callback和
variable两个参数。
这在后台是怎么实现的呢?在应用程序中我有一个功能助手(Helper Function)来输出JSON:
class ApplicationController < ActionController::Base
protected
def render_json(json, options={})
callback, variable = params[:callback], params[:variable]
response = begin
if callback && variable
"var #{variable} = #{json};\n#{callback}(#{variable});"
elsif variable
"var #{variable} = #{json};"
elsif callback
"#{callback}(#{json});"
else
json
end
end
render({:content_type => :js, :text => response}.merge(options))
end
end 然后我可以在我的
PeopleController#show 行为中相当简单地使用这段代码:
class PeopleController < ApplicationController
def show
@person = Person.find(params[:id])
respond_to do |format|
format.js { render_json @person.to_json }
end
end
end 并且这就是所有为了——用Rails实践JSON-P的输出。
[
本帖最后由 Ragnarok 于 2007-11-10 01:29 编辑 ]