Как указано в http://www.boutell.com/newfaq/misc/urllength.html , строка запроса HTTP имеет ограниченную длину. Он может быть ограничен клиентом (Firefox, IE, ...), сервером (Apache, IIS, ...) или сетевым оборудованием (прикладной брандмауэр, ...).
Сегодня сталкиваюсь с этой проблемой с формой поиска. Мы разработали форму поиска с большим количеством полей, и эта форма отправляется на сервер как запрос GET, поэтому я могу добавить страницу в закладки.
У нас так много полей, что наша строка запроса имеет длину 1100 байт, и у нас есть брандмауэр, который отбрасывает HTTP-запросы GET с более чем 1024 байтами. Наш системный администратор рекомендует вместо этого использовать POST, чтобы не было ограничений.
Конечно, POST будет работать, но я действительно чувствую поиск как GET, а не как POST. Поэтому я думаю, что пересмотрю наши имена полей, чтобы убедиться, что строка запроса не слишком длинная, и если я не могу, я буду прагматичен и буду использовать POST.
Но есть ли изъян в дизайне сервисов RESTful? Если у нас ограниченная длина в запросе GET, как я могу отправить большие объекты в веб-службу RESTful? Например, если у меня есть программа , которая делает расчеты , основанные на файле, и я хочу , чтобы обеспечить RESTful веб - сервиса , как это: http://compute.com?content=<base64 file>
. Это не сработает, потому что строка запроса не имеет неограниченной длины.
Я немного озадачен ...
Ответы:
Исходя из вашего описания, IMHO вы должны использовать POST. POST предназначен для размещения данных на сервере и, в некоторых случаях, для получения ответа. В вашем случае вы выполняете поиск (отправляете запрос на сервер) и получаете результат этого поиска (получаете результат запроса).
В определении GET говорится, что он должен использоваться для получения уже существующего ресурса. По определению, POST предназначен для создания нового ресурса. Это именно то, что вы делаете: создаете ресурс на сервере и получаете его! Даже если вы не сохраняете результат поиска, вы создали объект на сервере и получили его. Как ранее сказал PeterMmm, вы можете сделать это с помощью POST (создать и сохранить результат запроса), а затем использовать GET для получения запроса, но более практично сделать только POST и получить результат.
Надеюсь это поможет! :)
источник
Спецификация HTTP на самом деле советует использовать POST при отправке данных на ресурс для вычислений.
Ваш поиск выглядит как вычисление, а не как ресурс. Что вы можете сделать, если хотите, чтобы результаты поиска были ресурсом, - это создать токен, чтобы идентифицировать этот конкретный результат поиска и перенаправить пользовательский агент на этот ресурс.
Затем вы можете удалить токены результатов поиска через некоторое время.
пример
тогда
Таким образом, браузеры и прокси по-прежнему могут кэшировать результаты поиска, но вы отправляете параметры запроса с помощью POST.
РЕДАКТИРОВАТЬ
Для пояснения
01543164876
здесь представлен уникальный идентификатор ресурса, представляющего ваш поиск. Эти два запроса в основном означают: создать новый объект поиска с этими критериями, а затем получить результаты, связанные с созданным объектом поиска.Этот идентификатор может быть уникальным идентификатором, сгенерированным для каждого нового запроса. Это будет означать, что ваш сервер будет пропускать «поисковые» объекты, и вам придется регулярно их очищать с помощью стратегии кэширования.
Или это может быть хэш всех критериев поиска, фактически представляющих поиск, запрошенный пользователем. Это позволяет повторно использовать идентификаторы, поскольку воссоздание поиска вернет существующий идентификатор, который может (или не может) быть уже кэширован.
источник
REST - это способ делать что-то, а не протокол. Даже если вам не нравится POST, когда это действительно GET, он будет работать.
Если вы будете / должны придерживаться «стандартного» определения GET, POST и т.д., чем, возможно, рассмотрите возможность POST запроса, этот запрос будет сохранен на сервере с идентификатором запроса и запросить запрос позже с помощью GET по идентификатору.
источник
Что касается вашего примера:
http://compute.com?content={base64file}
я бы использовал POST, потому что вы загружаете «что-то» для вычисления. Для меня это «что-то» больше похоже на ресурс как простой параметр.В отличие от этого в обычном поиске я бы начал придерживаться GET и параметров. Вы упрощаете для api-клиентов тестирование и экспериментирование с вашим api. Сделайте доступ только для чтения (который в большинстве случаев составляет большую часть трафика) как можно проще!
Но дилемма больших строк запроса - это допустимое ограничение GET. Здесь я бы пошел прагматично, пока вы не достигнете этого предела, используйте GET и url-params. Это сработает в 98% случаев поиска. Действуйте только в том случае, если вы достигнете этого предела, а затем также введете POST с полезной нагрузкой (с mime-типом
Content-Type: application/x-www-form-urlencoded
).У вас есть еще примеры из реального мира?
источник
Путаница вокруг GET - это ограничение браузера. Если вы создаете интерфейс RESTful для приложения A2A или P2P, тогда нет ограничений на длину вашего GET.
Теперь, если вы захотите использовать браузер для просмотра своего интерфейса RESTful (во время разработки / отладки), вы столкнетесь с этим пределом, но есть инструменты, чтобы обойти это.
источник
Это очень просто. Используйте POST. HTTP не накладывает ограничения на длину URL для GET, но серверы это делают. Будьте прагматичны и обойдите это с помощью POST.
Вы также можете использовать тело GET (что разрешено), но это двойной удар, поскольку это неправильное использование и, вероятно, будут проблемы с сервером.
источник