Rails, REST Architecture и HTML 5: междоменные запросы с предполетными запросами - PullRequest
4 голосов
/ 18 мая 2010

Работая над проектом, направленным на то, чтобы сделать наш сайт дружественным к HTML 5, мы стремились использовать новый метод для кросс-доменных запросов (больше не нужно размещать сообщения через скрытые фреймы !!!). Используя спецификацию Access Control , мы начинаем настраивать некоторые тесты для проверки поведения различных браузеров.

Текущая архитектура RESTful Rails опирается на четыре HTTP-глагола: GET, POST, PUT, DELETE. Однако в спецификации контроля доступа указывается, что для непростых методов (PUT, DELETE) требуется предварительный запрос с использованием глагола HTTP OPTIONS. Кроме того, во время тестирования мы обнаружили, что Firefox 3.5.8 также выполняет предварительные запросы POST.

Мой вопрос такой. Кто-нибудь знает какой-либо проект для платформы Rails, работающий для решения этой проблемы? Если нет, то есть ли какие-либо мнения о наилучшей стратегии поддержки метода OPTIONS, поскольку он должен поддерживать маршруты для всех методов POST, PUT, DELETE?

Ответы [ 3 ]

8 голосов
/ 09 июня 2010

Пару дней назад я выпустил Gem, который реализует поддержку CORS через промежуточное программное обеспечение стойки:

http://github.com/cyu/rack-cors

Что касается предполетных запросов CORS, я не смог получить предварительные запросы, работающиеChrome (через простые CORS запросы работают нормально).Поиск по интернету предполагает, что он может не поддерживаться.Я задавал вопросы на форуме Chrome по этому поводу, но пока не получил ответа.

3 голосов
/ 09 июля 2012

Это из документации Spine js

Интеграция CORs Rails

Давайте создадим метод cor, который добавит некоторые заголовки управления доступом для запроса к ответу на запрос.

Добавьте следующее в app / application_controller.rb:

before_filter :cor

def cor
  headers["Access-Control-Allow-Origin"]  = "js-app-origin.com"
  headers["Access-Control-Allow-Methods"] = %w{GET POST PUT DELETE}.join(",")
  headers["Access-Control-Allow-Headers"] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(",")
  head(:ok) if request.request_method == "OPTIONS"
end

Хотя Access-Control-Allow-Origin использует подстановочный знак, я настоятельно рекомендую его не использовать, так как он открывает ваше приложение для всевозможных CSRF-атак,Использование белого списка намного лучше и безопаснее.

Раздел Access-Control-Allow-Headers важен, особенно заголовок X-Requested-With.Rails не нравится, если вы отправляете запросы Ajax на него без этого заголовка, и игнорирует заголовок Accept запроса, возвращая HTML, когда он фактически должен возвращать JSON.

Стоит отметить, что jQuery не добавляет этозаголовок для кросс-доменных запросов по умолчанию.Это проблема, которую Spine решает внутренне, но если вы используете простой jQuery для COR, вам нужно будет указать заголовок вручную.

jQuery.ajaxSetup({
  headers: {"X-Requested-With": "XMLHttpRequest"}
});

Некоторые браузеры сначала отправляют запрос параметров на сервер,чтобы убедиться, что установлены правильные заголовки доступа.Вам нужно поймать это в Rails, возвращая статус 200 с правильными заголовками.Для этого добавьте следующее в файл config / rout.rb вашего приложения:

match '*all' => 'application#cor', :constraints => {:method => 'OPTIONS'}

Вот и все, вы все настроены для перекрестных запросов с помощью Spine!

0 голосов
/ 15 июля 2010

Я взломал рельсы для поддержки метода опций. Я разместил это в списке рельсов, но он так и не прошел мимо списка.

GitHub Gist: Рельсы XHR2 / CORS / OPTIONS поддерживают

Ctrl + F, чтобы найти строки с #Options - это единственные, которые я изменил.

А вот пример реализации | и еще один

...