Создание маршрута с помощью Sinatra для приема только определенного типа контента - PullRequest
7 голосов
/ 22 ноября 2011

Я пытаюсь создать маршрут с Синатрой, который принимает POST только с Content-type: application/json без успеха.

Мой подход заключается в следующем:

post '/dogs', :provides => :json do
  # returns here a json response
end

Тестирование с помощью curl,Я видел, что :provides => :json настраивает маршрут для ответа Content-Type: application/json.

Это верно, потому что я хочу также ответить сообщением JSON на запрос POST, но мне действительно нужно, чтобы этот маршрут отвечал только на запросы POST с Content-Type: application/json, а не, например, на другие (например, Content-Type: application/xml).

Есть ли в Синатре какой-либо способ ограничить маршрут, чтобы принимать запросы только с определенным Content-Type?

Ответы [ 3 ]

12 голосов
/ 22 ноября 2011

Запросы не содержат заголовок «Content-Type», а скорее имеют «Accept».Синатра должен отвечать на запросы только с помощью «Accept», содержащего «application / json».Просто чтобы убедиться:

post '/gods', :provides => :json do
  pass unless request.accept? 'application/json'
...
end
9 голосов
/ 24 ноября 2011

Прочитайте это

http://rack.rubyforge.org/doc/classes/Rack/Request.html

request.content_type скажет вам

Фил может быть прав в отношении RFC, но на самом деле многие вещи помещают тип контента вPOST-запрос, поэтому полезно знать, что это такое.

0 голосов
/ 04 февраля 2014

я бы подумал, что это что-то вроде:

pass unless request.accept? == 'application/json'
...