Запрос REST не может быть закодирован для GET (слишком длинный URL)
Пример:
Метод:
GET
Ответ: Все предметы в
collection
согласованиеa search term
,
Проблема. Поисковый термин может быть настолько длинным, что нарушает максимальную длину 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.