Краткий ответ: в запросах 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
. Для тех, кто заинтересован, вот вопрос об этом .