Где в post-запросе передаются параметры?

623
11 августа 2017, 00:36

В стандарте HTTP есть 3 составляющие: стартовая строка, заголовки и тело.

Когда отправляю GET-запрос, то все параметры идут вместе с URI. Например

GET /index.php?name='myname'&age=26 HTTP/1.1

А когда я передаю те же самые данные, но методом POST, то эти параметры name и age где передаются? В теле запроса? В заголовках? Как выглядит этот HTTP-запрос?

Имеется ввиду чистый HTTP-запрос, как прописано в протоколе.

Если переформулировать вопрос. PHP, когда формирует массив $_POST, то данные этого массива из какой части HTTP-запроса берет? В случае с $_GET все понятно, берет из URI. А с $_POST неясно.

Answer 1

Итак, подытожу всё что тут сказали

GET Передаётся в URL

GET https://example.com/comments?page=2&pageSize=10

POST Передаёт данные в теле

POST https://example.com/comments HTTP/1.1
content-type: application/json
{
    "name": "sample",
    "time": "Wed, 21 Oct 2015 18:27:50 GMT"
}

Заголовок content-type определяет как данные будут переданы (JSON или кодированы url-encoded) таким образом сервер поймёт как их обработать.

На заметку:

GET

  • Могут кэшироваться
  • Остаются в истории браузера
  • Могут быть/стать "закладкой"
  • Не должны использоваться для передачи паролей и всего такого
  • Имеют ограничение по длине (URL и в некоторых браузерах свои заморочки)

POST

  • Никогда не кэшируются
  • Не остаются в истории браузера
  • Не могут быть/стать "закладкой"
  • Не имеют таких ограничений по длине (обычно в браузерах и на web серверах есть ограничение по умолчанию)
Answer 2

Данные POST запроса передаются в теле. То есть стартовая строка, потом заголовки, пустая строчка, а дальше идут параметры POST. Часто в формате url-encoded (formdata) - это как в адресной сроке у GET запроса, но в последнее время есть тенденция передавать в теле json. Формат кодировки запроса определяется по заголовку Content-encoding.

Answer 3

А когда я передаю те же самые данные, но методом POST, то как выглядит этот http-запрос?

Очень удобно использовать утилиту nc для отладки текстовых протоколов. Запустите её с флагом -l с указанием порта, который она будет прослушивать, и выполните свой POST-запрос на localhost в соседнем терминале.

nc -l 8080
curl http://localhost:8080/index.php -d name=myname -d age=26

Вы увидите примерно следующее

POST /index.php HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.47.0
Accept: */*
Content-Length: 18
Content-Type: application/x-www-form-urlencoded
name=myname&age=26
READ ALSO
Плагин HTML5 video от ckeditor

Плагин HTML5 video от ckeditor

Поставил плагин HTML5 video от ckeditor

626
Вызов нескольких функций класса разом

Вызов нескольких функций класса разом

Сразу извиняюсь если некорректно назвал топик, но интересует такая тема:

487
CURL перекодировка ответа

CURL перекодировка ответа

С помощью curl получаю данные со стороннего сайта, изначально его кодировка не известнаВ случае если кодировка windows-1251 получаю не читаемый...

547
Как вытащить правильно массив

Как вытащить правильно массив

Подскажите пожалуйста, как извлечь данные через foreach? на выходе получается неподходящий для этого объектНужно, чтобы можно было сделать key => value,...

516