Значения отправляются в теле запроса в формате, который указывает тип содержимого.
Обычно это тип контента application/x-www-form-urlencoded
, поэтому тело запроса использует тот же формат, что и строка запроса:
parameter=value&also=another
Когда вы используете загрузку файла в форме, multipart/form-data
вместо этого вы используете кодировку, которая имеет другой формат. Это сложнее, но обычно вам не нужно заботиться о том, как это выглядит, поэтому я не буду показывать пример, но было бы полезно знать, что он существует.
multipart/form-data
. Для тех, кто заинтересован, вот вопрос об этом .multipart/form-data
или, если вы отвечаете за создание запроса, изменить тип содержимого наapplication/json
и вставить текст json непосредственно в текст httpСодержимое помещается после заголовков HTTP. Формат HTTP POST должен иметь заголовки HTTP, сопровождаемые пустой строкой и телом запроса. Переменные POST хранятся в виде пар ключ-значение в теле.
Вы можете увидеть это в необработанном содержании HTTP-сообщения, показанном ниже:
Это можно увидеть с помощью такого инструмента, как Fiddler , который можно использовать для просмотра необработанных HTTP-запросов и полезных нагрузок ответов, передаваемых по проводам.
источник
application/x-www-form-urlencoded
, что не всегда так.From
заголовок?From
заголовка. ИМО это там с кодом статуса 418 HTTP.Краткий ответ: в запросах POST значения отправляются в «теле» запроса. С веб-формами они, скорее всего, отправляются с типом носителя
application/x-www-form-urlencoded
илиmultipart/form-data
. Языки программирования или рамки , которые были предназначены для обработки веб-запросов , как правило , делают «The Right Thing ™» с такими запросами и предоставить вам легкий доступ к легко расшифрованных значений (например ,$_REQUEST
или$_POST
в PHP, илиcgi.FieldStorage()
,flask.request.form
в Python).Теперь давайте немного отвлечемся, что может помочь понять разницу;)
Разница между
GET
иPOST
запросами в основном семантической. Они также «используются» по-разному, что объясняет разницу в передаче значений.GET ( соответствующий раздел RFC )
При выполнении
GET
запроса вы запрашиваете у сервера одну или несколько сущностей. Чтобы позволить клиенту фильтровать результат, он может использовать так называемую «строку запроса» URL-адреса. Строка запроса является частью после?
. Это часть синтаксиса URI .Таким образом, с точки зрения кода вашего приложения (части, которая получает запрос), вам нужно будет проверить часть запроса URI, чтобы получить доступ к этим значениям.
Обратите внимание, что ключи и значения являются частью URI. Браузеры могут наложить ограничение на длину URI. Стандарт HTTP гласит, что ограничений нет. Но на момент написания этой статьи, большинство браузеров действительно ограничивают идентификаторы URI (я не имею конкретных значений).
GET
Запросы никогда не должны использоваться для отправки новой информации на сервер. Особенно не большие документы. Вот где вы должны использоватьPOST
илиPUT
.POST ( соответствующий раздел RFC )
При выполнении
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 ( соответствующий раздел RFC )
PUT
Запрос в значительной степени обрабатываются точно так же, какPOST
запрос. Большая разница состоит в том, чтоPOST
запрос должен позволить серверу решить, как (и вообще ли) создать новый ресурс. Исторически (из устаревшего RFC2616 он должен был создать новый ресурс как «подчиненный» (дочерний) URI, в который был отправлен запрос).PUT
Запрос в отличии предполагается «депозит» ресурс именно на этом URI, и именно это содержание. Не больше, не меньше. Идея заключается в том , что клиент несет ответственность за ремесло полного ресурса , прежде чем «Собирает» его. Сервер должен принять это как есть на данном URL.Как следствие,
POST
запрос обычно не используется для замены существующего ресурса.PUT
Запрос может сделать как создать и заменить.Примечание
Существуют также « параметры пути », которые можно использовать для отправки дополнительных данных на удаленный компьютер, но они настолько необычны, что я не буду вдаваться в подробности. Но, для справки, вот выдержка из RFC:
источник
PUT
разделе, вы увидите , что она является идемпотентом.POST
в отличие от этого - по определению - не может быть.POST
всегда будет создавать новый ресурс.PUT
будет, если идентичный ресурс существует заменить его. Поэтому, если вы позвонитеPOST
10 раз, вы создадите 10 ресурсов. Если вы позвонитеPUT
10 раз, он (возможно) создаст только один. Это отвечает на ваш вопрос?Вы не можете ввести его непосредственно в адресной строке браузера.
Например, вы можете увидеть, как данные POST отправляются в Интернет с помощью живых HTTP-заголовков . Результат будет примерно таким
Где это говорит
будут почтовые значения.
источник
Content-Length
должно быть29
здесь? Это фактическая длина строкиusername=zurfyx&pass=password
.Тип носителя по умолчанию в запросе POST это
application/x-www-form-urlencoded
. Это формат для кодирования пар ключ-значение. Ключи могут быть дубликатами. Каждая пара ключ-значение отделяется&
символом, а каждая клавиша отделяется от своего значения=
символом.Например:
Кодируется как:
Это помещается в тело запроса после заголовков HTTP.
источник
Значения форм в HTTP POST отправляются в теле запроса в том же формате, что и строка запроса.
Для получения дополнительной информации см. Спецификацию .
источник
?
например?application/x-www-form-urlencoded
, что не всегда так.Некоторые веб-сервисы требуют, чтобы вы размещали данные запроса и метаданные отдельно. Например, удаленная функция может ожидать, что подписанная строка метаданных включена в URI, а данные размещаются в HTTP-теле.
Запрос POST может семантически выглядеть так:
Этот подход логически объединяет QueryString и Body-Post, используя единый объект,
Content-Type
который является «инструкцией синтаксического анализа» для веб-сервера.Обратите внимание: HTTP / 1.1 заключен в
#32
(пробел) слева и#10
(перевод строки) справа.источник
/user/john
и/?user=john
является просто семантической (HTTP на самом деле не дает особого отношения к строкам запроса), поэтому я воспринимаю это как разумное ожидание. Но что вы имеете в виду под «завернутым в пространство слева»? До метода HTTP нет пробелов. Вы имеете в виду пустую строку для тела сообщения?...Ym04
иHTTP/1.1
в приведенном выше коде есть пробел (ASCII # 32) . Таким образом, QueryString просто находится между глаголом и версией протокола.?
как мы делаем сGET
запросами.Прежде всего, давайте различать
GET
иPOST
Получить: Это по умолчанию
HTTP
запрос , который сделан на сервер и используется для извлечения данных из сервера и строки запроса , который приходит после того, как?
вURI
используются для получения уникального ресурса.это формат
здесь
data=value
передано значение строки запроса.POST: используется для безопасной отправки данных на сервер, поэтому все, что нужно, это формат
POST
запроса.Почему ПОСТ над GET?
В
GET
значение, отправляемое на серверы, обычно добавляются к базовому URL в строке запроса, теперь есть 2 последствия этогоGET
запросы сохраняются в истории браузера с параметрами. Таким образом, ваши пароли остаются незашифрованными в истории браузера. Это было настоящей проблемой для Facebook в те времена.URI
. Если отправлено слишком много параметров, вы можете получить414 Error - URI too long
В случае отправки запроса ваши данные из полей будут добавлены в тело. Длина параметров запроса вычисляется и добавляется в заголовок для длины содержимого, и к URL-адресу не добавляются важные данные.
Вы можете использовать сетевой раздел Инструментов Google для разработчиков, чтобы увидеть основную информацию о том, как запросы поступают на серверы.
и вы всегда можете добавить больше значения в вашем
Request Headers
Как иCache-Control
,Origin
,Accept
.источник
HTTPS
связи, а неHTTP
.HTTPS
шифрует какURL
(включая параметры запроса), так иRequest Body
, когдаHTTP
шифрует / защищает ни то, ни другое. Описанная проблема возникает из-за того, что многие браузеры хранятURIs
(в том числеURLs
) в своих базах данных истории (обычно не зашифрованных). Таким образом, используйте толькоRequest Body
+HTTPS
для чего-то чувствительного.