Запрос REST не может быть закодирован для GET (слишком длинный URL)

Пример:

Проблема. Поисковый термин может быть настолько длинным, что нарушает максимальную длину URL-адреса веб-сервера.

Как мне разрешить очень длинные условия поиска и при этом оставаться RESTful?

3 ответа

Для вдохновения я только что посмотрел на API Google Translate v2, который "использует стиль вызова RESTful".

Естественно, тексты для перевода могут быть довольно длинными. И поэтому Google опционально позволяет отправлять запрос с POST, но с изюминкой:

Использовать POST, вы должны использовать X-HTTP-Method-Override заголовок, чтобы сообщить Translate API для обработки запроса как GET (использование X-HTTP-Method-Override: GET).

Таким образом, можно семантически преобразовать POST запрос в GET запрос.

(Это открытие привело меня к добавлению тега /questions/tagged/x-http-method-override в мой вопрос.)

REST не ограничивает POST созданием. Будьте осторожны с отображением CRUD в HTTP методы и предположите, что это RESTful. POST - это метод, используемый для любого действия, которое не стандартизировано HTTP.

Поскольку стандарт не устанавливает ограничения для URI, это может считаться нарушенной реализацией, и это можно исправить. Пока обходной путь слабо связан с вашим API, вы все еще RESTful. Это означает, что ваш API не должен реализовывать перевод или переопределение напрямую, а на каком-то препроцессоре, который правильно переписывает запрос. Где-то должно быть четко задокументировано, что это связано с неработающей реализацией, и вы ожидаете, что она в конечном итоге устареет.

Это неприятный запах, если ваш запрос может быть настолько длинным, что он превышает максимальную длину (де-факто для браузеров составляет 2000 символов, но он может быть выше для других средств доступа к API REST).

Если пользователь может передать столько данных, он должен идти в теле запроса / поле данных, а не в URL.

Другие вопросы по тегам