Статьи

Вывод JSON-P с помощью Rails

На недавней конференции 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.