2014-11-24 3 views
0

Я собираюсь провести учебный семинар по REST для некоторых сотрудников, и я хотел бы проверить что-то относительно маршрутизации Rails.Различия в спецификациях формата Rails

Наше приложение в его нынешнем виде позволяет клиентам указать формат тремя различными способами:

1.

/path/to/resource.json 

2.

/path/to/resource?format=json 

3.

Accept заголовок запроса

Мой вопрос относится к первым двум вариантам: есть ли какая-либо неотъемлемая разница в том, что делают эти спецификации? В частности, они устанавливают только заголовок Accept или заголовок Content-Type?

+0

содержание type head! – Rubyrider

+0

Спасибо, у вас есть документация, чтобы поддержать это? Это то, что меня больше всего интересует. –

+0

yah wait Я предоставляю детали – Rubyrider

ответ

0

Ну, 1 и 2 не совсем различны, так как Rails обычно генерирует маршруты, такие как:

/something(.:format) 

Это означает, что «есть опционально параметр format с разделительной точкой». Параметры, однако, также могут быть указаны в строке запроса , которая не является частью маршрута.

Итак, второй способ запроса для JSON заставит систему маршрутов думать, что format не находится на маршруте вообще. Однако, когда дело доходит до контроллера, Rails уже проведет эту строку запроса и найдет формат, когда придет время ответить.

Это, если вы нажмете равнину /path/to/resource без format, указанную в любом месте, вы получите тот же результат, что и 2: вы выбрали маршрут, предполагая, что формат не указан. Тем не менее Rails будет анализировать заголовки и определять формат, на который он должен отвечать.

Что касается того, что клиент должен установить: accept header only, Content-Type имеет смысл только когда сам пользователь отправляет объект, и это относится только к «как следует Рельсы анализировать входящие параметры», это не связано с ответом. Конечно, по умолчанию Rails делает все возможное, чтобы установить Content-Type ответа на разумность.

+0

Спасибо за подробное объяснение. Может быть, это не связано, но я пойду вперед и спрошу. Я замечаю (через tailing test.log и проверяя параметры в контроллере) при запуске спецификаций API, которые параметры анализируются по-разному (числа остаются в виде чисел, а не преобразуются в строки), когда я явно передаю 'format:: json' в запрос.Это дало мне представление о том, что он каким-то образом устанавливает заголовок Accept. Разве это не так? –

+0

@BradRice Какой запрос? Из тестовой структуры? Какие параметры затем указываются в строке запроса или отправляются как объект через 'POST' и подобные? –

+0

Используя инфраструктуру RSpec, я тестирую действие индекса контроллера. 'пусть (: PARAMS) {{my_resource_id: my_resource.to_param, формат:: JSON}}' ' субъект (: invoke_request) {получаем: индекс, PARAMS}' Затем слияния в других параметров под контекста блока , Когда я передаю эти параметры в рамках теста, они являются целыми числами. Если я не передаю формат в параметрах (как я уже говорил выше), контроллер анализирует их как строки. Если я добавлю в спецификатор формата, они анализируются как целые числа. –

0

Пожалуйста проверка следующие инициализаторами: https://github.com/rails/rails/blob/756baf296b3cb3f7bc40d5843e259276695071ab/actionpack/lib/action_dispatch/http/response.rb#L113

Это где, как они смотрят на заголовки типа содержимого, чтобы установить для.

if content_type = self[CONTENT_TYPE] 
type, charset = content_type.split(/;\s*charset=/) 
@content_type = Mime::Type.lookup(type) 
@charset = charset || self.class.default_charset 
end 

так что вы можете даже установить программно content_type в заголовок, или PARAMS или как .format

 Смежные вопросы

  • Нет связанных вопросов^_^