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

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

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

5 ответов


лучший способ визуализировать это-использовать анализатор пакетов, такой как 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-адрес, указанный в заголовке местоположения, вместо отображения HTML ответ):

HTTP GET with 302 redirect

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

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

HTTP POST TCP Stream


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

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

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

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

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


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


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


Если ваш пост пытается достичь следующего URL

файла mypage.РНР?id=1

У вас будут данные POST, но также получите данные.