#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 какие-либо помощники или классы для решения этой проблемы?