На недавней конференции Web Directions 06 Кэмерон Адамс и собственный разработчик Sitepoint Кевин Янк выступили с докладом о Mashups и API , упомянув о JSON-P.
JSON-P — это метод упаковки вывода JSON ваших вызовов API, чтобы позволить другим разработчикам вызывать ваш API изнутри своей страницы, минуя механизм безопасности браузера.
Если вы посмотрите на HTML-источник Web Connections, вы заметите, что мы используем JSON-P для предоставления данных JS для сопоставления. В URL-адресе вызова JSON-P мы можем указать variable
параметра, callback
или оба, и это позволит другим использовать наш JSON в своих собственных коллажах.
Он также прекрасно интегрируется с новой функциональностью Rails REST. Например, страницу профиля Джереми Кейта также можно вывести в формате JSON, добавив в конце «.js» . Это хорошо, но не очень полезно, если вы хотите позвонить с другой страницы.
Скажем, Джереми хотел скопировать эти данные на своем веб-сайте, чтобы показать, с кем он дружит. Ему понадобится какой-нибудь вывод JSON-P, чтобы он мог получить доступ к данным из тега script
.
Чтобы добавить «заполнение» JSON-P, достаточно указать параметр «variable», объявляющий имя переменной Javascript, которой вы хотите назначить вывод. Для этого примера мы укажем ‘variable = personJSON’ . Заметили разницу в выходе? Теперь попробуйте указать callback
или как callback
callback
, так и variable
.
Так как это реализовано за кулисами? У меня есть вспомогательная функция, которую я использую в приложении для вывода 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
и это все, что нужно сделать. Вывод JSON-P с помощью Rails.