Краткий ответ: в запросах POST значения отправляются в «теле» запроса. С веб-формами они, скорее всего, отправляются с типом носителя application/x-www-form-urlencodedили multipart/form-data. Языки программирования или рамки , которые были предназначены для обработки веб-запросов , как правило , делают «The Right Thing ™» с такими запросами и предоставить вам легкий доступ к легко расшифрованных значений (например , $_REQUESTили $_POSTв PHP, или cgi.FieldStorage(), flask.request.formв Python).
Теперь давайте немного отвлечемся, что может помочь понять разницу;)
Разница между GETи POSTзапросами в основном семантической. Они также «используются» по-разному, что объясняет разницу в передаче значений.
При выполнении GETзапроса вы запрашиваете у сервера одну или несколько сущностей. Чтобы позволить клиенту фильтровать результат, он может использовать так называемую «строку запроса» URL-адреса. Строка запроса является частью после ?. Это часть синтаксиса URI .
Таким образом, с точки зрения кода вашего приложения (части, которая получает запрос), вам нужно будет проверить часть запроса URI, чтобы получить доступ к этим значениям.
Обратите внимание, что ключи и значения являются частью URI. Браузеры могут наложить ограничение на длину URI. Стандарт HTTP гласит, что ограничений нет. Но на момент написания этой статьи, большинство браузеров действительно ограничивают идентификаторы URI (я не имею конкретных значений). GETЗапросы никогда не должны использоваться для отправки новой информации на сервер. Особенно не большие документы. Вот где вы должны использовать POSTили PUT.
При выполнении POSTзапроса клиент фактически отправляет новый документ на удаленный хост. Таким образом, строка запроса (семантически) не имеет смысла. Вот почему у вас нет доступа к ним в коде приложения.
POSTнемного более сложный (и способ более гибкий):
При получении запроса POST вы всегда должны ожидать «полезную нагрузку» или, в терминах HTTP: тело сообщения . Тело сообщения само по себе довольно бесполезно, так как нет стандартного (насколько я могу судить. Может быть, application / octet-stream?) Формата. Формат тела определяется Content-Typeзаголовком. При использовании FORMэлемента HTML с method="POST", это обычно application/x-www-form-urlencoded. Другой очень распространенный тип - multipart / form-data, если вы используете загрузку файлов. Но это может быть что угодно , начиная от text/plain, сверх application/jsonили даже обычай application/octet-stream.
В любом случае, если POSTзапрос сделан с помощью, Content-Typeкоторый не может быть обработан приложением, он должен вернуть 415код состояния .
Большинство языков программирования (и / или веб-фреймворков) предлагают способ де / кодирования тела сообщения из / в наиболее распространенные типы (например application/x-www-form-urlencoded, multipart/form-dataили application/json). Так легко. Пользовательские типы потенциально требуют немного больше работы.
Используя в качестве примера стандартный кодированный HTML-документ, приложение должно выполнить следующие шаги:
- Читать
Content-Typeполе
- Если значение не относится к поддерживаемым типам мультимедиа, вернуть ответ с
415кодом состояния
- в противном случае декодируйте значения из тела сообщения.
Опять же, языки вроде PHP или веб-фреймворки для других популярных языков, вероятно, справятся с этим за вас. Исключением является 415ошибка. Никакая структура не может предсказать, какие типы контента выберет ваше приложение для поддержки и / или не поддержки. Это зависит от вас.
PUTЗапрос в значительной степени обрабатываются точно так же, как POSTзапрос. Большая разница состоит в том, что POSTзапрос должен позволить серверу решить, как (и вообще ли) создать новый ресурс. Исторически (из устаревшего RFC2616 он должен был создать новый ресурс как «подчиненный» (дочерний) URI, в который был отправлен запрос).
PUTЗапрос в отличии предполагается «депозит» ресурс именно на этом URI, и именно это содержание. Не больше, не меньше. Идея заключается в том , что клиент несет ответственность за ремесло полного ресурса , прежде чем «Собирает» его. Сервер должен принять это как есть на данном URL.
Как следствие, POSTзапрос обычно не используется для замены существующего ресурса. PUTЗапрос может сделать как создать и заменить.
Примечание
Существуют также « параметры пути », которые можно использовать для отправки дополнительных данных на удаленный компьютер, но они настолько необычны, что я не буду вдаваться в подробности. Но, для справки, вот выдержка из RFC:
Помимо точечных сегментов в иерархических путях, сегмент пути считается непрозрачным по общему синтаксису. Приложения, генерирующие URI, часто используют зарезервированные символы, разрешенные в сегменте, для разграничения подкомпонентов, специфичных для схемы или обработчика разыменования. Например, зарезервированные символы точки с запятой (";") и равенства ("=") часто используются для разделения параметров и значений параметров, применимых к этому сегменту. Запятая (",") зарезервированный символ часто используется для аналогичных целей. Например, один производитель URI может использовать сегмент, такой как «name; v = 1.1», чтобы указать ссылку на версию 1.1 «name», тогда как другой может использовать сегмент, такой как «name, 1.1», чтобы указать то же самое. Типы параметров могут быть определены специфичной для схемы семантикой,
multipart/form-data. Для тех, кто заинтересован, вот вопрос об этом .