Требовать тип содержимого ‘application / json’ для соответствующих запросов в Rails

#ruby-on-rails #content-type

#ruby-on-rails #тип содержимого

Вопрос:

У меня есть API, который работает почти исключительно application/json в Rails. Несколько конечных точек могут обрабатывать application/x-www-form-urlencoded загрузку файлов.

Я хочу обеспечить соблюдение типов содержимого: когда клиент добавляет что-либо, отличное от того, что application/json я хочу отправить обратно ошибку 406 — not acccepted, в моем ApplicationController

 before_action :require_content_type_json

def require_content_type_json
  return if request.content_type == Mime::JSON.to_s
  head status: 406
end
 

Однако в RFC 7231 (http) указано, что:

Отправитель, который генерирует сообщение, содержащее тело полезной нагрузки, ДОЛЖЕН сгенерировать поле заголовка типа содержимого в этом сообщении, если только предполагаемый тип носителя вложенного представления неизвестен отправителю. Если поле заголовка типа содержимого отсутствует, получатель МОЖЕТ либо принять тип носителя «application / octet-stream» ([RFC2046], раздел 4.5.1), либо изучить данные, чтобы определить их тип.

Я грубо интерпретирую это как «когда запрос приходит с телом, тип содержимого должен быть предоставлен клиентом, иначе сервер должен принять «application / octet-stream».

Поскольку я не могу обрабатывать поток октетов, я хочу вернуть 406 — там тоже не принято. Другими словами: когда есть тело, заголовок, устанавливающий тип содержимого на «application / json», должен присутствовать. Всегда.

Итак, как мне определить, должен ли пользователь отправлять заголовок типа содержимого? Достаточно ли просто проверить !request.body.empty? : тело не пустое?

Или я должен предположить, что только запросы GET / OPTIONS / HEAD не имеют тела, а все остальные имеют и должны требовать content-type?

Есть ли у Rails какие-либо помощники или классы для решения этой проблемы?