it-swarm.com.ru

Методы HTTP POST отправляют данные как QueryString?

Я хотел бы знать, отправляет ли метод POST по HTTP данные в виде QueryString или использует специальную структуру для передачи данных на сервер.

Фактически, когда я анализирую связь с помощью метода POST от клиента к серверу (например, с помощью Fiddler), я не вижу какой-либо QueryString, но контекст формы тела с парами имя/значение.

50
kwichz

Лучший способ визуализировать это - использовать анализатор пакетов, например Wireshark и следуйте за потоком TCP . HTTP просто использует TCP для отправки потока данных, начиная с нескольких строк заголовков HTTP. Часто эти данные легко читать, потому что они состоят из HTML, CSS или XML, но это могут быть данные любого типа, которые передаются через Интернет (исполняемые файлы, изображения, видео и т.д.).

Для запроса GET ваш компьютер запрашивает определенный URL-адрес, а веб-сервер обычно отвечает кодом состояния 200, а содержимое веб-страницы отправляется непосредственно после заголовков ответа HTTP. Это тот же контент, который вы увидели бы, если бы просматривали источник веб-страницы в своем браузере. Упомянутая вами строка запроса является лишь частью URL и включается в заголовок запроса HTTP GET, который ваш компьютер отправляет на веб-сервер. Ниже приведен пример HTTP-запроса GET для http://accel91.citrix.com:8000/OA_HTML/OALogout.jsp?menu=Y с последующим ответом 302 о перенаправлении с сервера. Некоторые заголовки HTTP переносятся из-за размера окна просмотра (в действительности они занимают только одну строку каждая), а перенаправление 302 включает в себя простую веб-страницу HTML со ссылкой на перенаправленную веб-страницу (большинство браузеров автоматически перенаправляют любой ответ 302). на URL-адрес, указанный в заголовке Location вместо отображения HTML-ответа):

HTTP GET with 302 redirect

Для запроса POST у вас все еще может быть строка запроса, но это необычно и не имеет ничего общего с данными, которые вы отправляете. Вместо этого данные включаются непосредственно после заголовков HTTP, отправляемых вашим браузером на сервер, аналогично ответу 200, который веб-сервер использует для ответа на запрос GET. В случае POSTing простой веб-формы эти данные кодируются с использованием той же кодировки URL , что используется в строке запроса, но если вы используете веб-службу SOAP, они также могут быть кодируется с использованием многочастный формат MIME и данные XML .

Например, вот как выглядит HTTP POST для веб-службы SOAP на основе XML, расположенной по адресу http://192.168.24.23:8090/msh в Wireshark Follow TCP Stream :

HTTP POST TCP Stream

50
Greg Bray

Post использует тело сообщения для отправки информации обратно на сервер, в отличие от Get, который использует строку запроса (все после знака вопроса). Можно отправить как строку запроса Get, так и тело сообщения Post в одном запросе, но это может немного запутать, поэтому лучше избегать.

Как правило, лучшие практики требуют, чтобы вы использовали Get, когда вы хотите получить данные, и Post, когда вы хотите их изменить. (Эти правила не установлены в полном объеме, спецификации не запрещают изменять данные с помощью Get, но их обычно избегают на том основании, что вы не хотите, чтобы люди вносили изменения, просто щелкая ссылку или вводя URL)

И наоборот, вы можете использовать Post для извлечения данных без их изменения, но использование Get означает, что вы можете добавить страницу в закладки или поделиться URL-адресом с другими людьми, что вы не смогли бы сделать, если бы использовали Post.

Что касается фактического формата данных, отправляемых в теле сообщения, то это полностью зависит от отправителя и указывается в заголовке Content-Type. Если не указан, тип содержимого по умолчанию для форм HTML - это application/x-www-form-urlencoded, что означает, что сервер будет ожидать, что тело сообщения будет строкой, закодированной аналогично строке запроса GET. Однако это не может зависеть во всех случаях. RFC2616 говорит следующее в заголовке Content-Type:

Любое сообщение HTTP/1.1, содержащее тело объекта, ДОЛЖНО включать
Поле заголовка Content-Type, определяющее тип носителя этого тела. Если
и только если тип мультимедиа не указан в поле Content-Type,
получатель МОЖЕТ попытаться угадать тип носителя путем проверки его
содержимое и/или расширение (я) имени URI, используемого для идентификации
ресурс. Если тип носителя остается неизвестным, получатель ДОЛЖЕН
трактует его как тип "application/octet-stream".

20
GordonM

POST request can включает строку запроса, но обычно это не так - стандартная HTML-форма с действием POST обычно не включает строку запроса например.

17
Justin

GET отправит данные в виде строки запроса, но POST не отправит. Скорее он отправит его в теле запроса.

4
ataddeini

Если ваш пост попытается перейти по следующему URL

mypage.php? ID = 1

у вас будут данные POST, а также данные GET.

1
jsgoupil