2014-09-29 2 views
0

Для API только приложения, я имею в виду проверки входящего запроса HTTP с before_action, например .:Соответствующий способ ответа на неподдерживаемые HTTP-запросы?

# Returns a 405 status for unsupported HTTP methods. 
def verify_post_request 
    head :method_not_allowed unless request.post? 
end 

Но я не люблю того, чтобы создать дополнительные маршруты для обработки каждого неподдерживаемого метода HTTP. Без дополнительных маршрутов приложение возвращает 404 для неподдерживаемых запросов, поскольку соответствующий маршрут не найден. Наличие всех этих дополнительных «неиспользуемых» маршрутов кажется запахом кода.

Какая у вас лучшая практика? Является ли это лучше

  • Есть маршруты для поддерживаемых методов, которые вы поддерживаете, и 404 в противном случае
  • Есть маршруты для всех методов, так что неподдерживаемые те отвечают более информативный 405

Бывших кажется лучше поддерживающий (код чистки), в то время как последний кажется лучше для пользователя (описательная обратная связь).

+0

Я не вижу причин для этого. Это дополнительная работа или что-то, что не является частью приложения. Если у меня есть «ресурс: пользователь», определенный на моих маршрутах, почему я хочу иметь еще 20 строк, определяющих все другие комбинации типов запросов и путей, которые неявно определяются «ресурсом»? – Jon

+0

@Jon, имея маршруты для других методов HTTP, позволяет вам возвращать более точный ответ IMO. Например, если кто-то делает запрос, используя PUT вместо PATCH, ваше приложение может ответить более информативным 405 «Метод не поддерживается» вместо 404 «Не найден». Что касается количества строк, вам не обязательно нужно больше линий в зависимости от того, как вы маршрутизируете. Например. 'match '/ foo/bar/action', to: 'foo/bar # action', через: [: get,: post]' vs 'match '/ foo/bar/action', to: 'foo/bar # action ', через:: all' – Dennis

+1

Я написал что-то вроде 20 приложений RoR. Это никогда не имело значения. Если кто-то использует неправильный метод HTTP, то они делают что-то странное или неправильное с вашим приложением, и нет никаких причин для их удовлетворения. Я знаю, что это звучит жестко, но пока пользователи используют ваши ссылки и формы, и вы правильно настроили его и проверяете охват, чтобы гарантировать, что, другими словами, обычное приложение, оно ничего не добавит к опыту ваших пользователей. дать им более подробные ошибки, если они попытаются каким-то образом использовать неправильный глагол для доступа к странице. –

ответ

3

Я бы пошел с маршрутами для методов, которые вы поддерживаете, и 404 в противном случае.
Я думаю, что ваше приложение должно отвечать только маршрутам, в которых это необходимо, и оставить все остальные маршруты.

Нет необходимости предоставлять более информативные ответы. Не существующий маршрут - это маршрут 404 и ничего больше.

+0

Я хотел бы указать читателям, что этот ответ был добавлен до того, как я сделал свое редактирование, пояснив, что это приложение только для API. Это очень важное различие, которое я случайно забыл. Это означает, что коды ответов имеют значение намного больше, поскольку количество обратной связи ограничено. Тем не менее, я не поддержал этот ответ, потому что мне не хватает аргумента. Почему, по вашему мнению, нет необходимости предоставлять более информативные ответы? – Dennis

+0

Одна из вещей, определяющих маршрут, - это http-глагол. 'POST/user/1' отличается от' GET/user/1'. Предположим, что у вас есть только «POST/user /: id», а пользователь нажимает «GET/user/1» (API, браузер и т. Д.). Поскольку у вас нет 'GET/user /: id', так что маршрут не существует и не найден, и должен быть 404. –