#http #form-data
#http #форма-данные
Вопрос:
Я пытаюсь понять, как браузер интерпретирует данные формы. Я знаю, что http-запрос состоит из [Метода] [заголовка] [URL] [Параметров] [Тела]
Я не знаю, как поместить туда данные формы? интерпретируется ли оно как параметры (строка запроса) или оно отправляется в теле? кроме того, что такое application/x-www-form-urlencoded в заголовке?
Ответ №1:
Данные формы действительно отправляются внутри тела HTTP запроса POST
если я разберу запрос POST:
Request line > POST /index.php HTTP/1.1
Headers > Cache-Control: max-age=0
> Origin: http://localhost:8080
> Upgrade-Insecure-Requests: 1
> DNT: 1
The content
type header > Content-Type: application/x-www-form-urlencoded
Also headers > User-Agent: Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/85.0.4183.121Safari/537.36
> Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
> Sec-Fetch-Site: same-origin
> Sec-Fetch-Mode: navigate
> Sec-Fetch-User: ?1
> Sec-Fetch-Dest: document
> Referer: http://localhost:8080/index.php
> Accept-Encoding: gzip,deflate,br
> Accept-Language: cs-CZ,cs;q=0.9,en;q=0.8
Empty line >
Body > fname=Johnamp;lname=Doeamp;formsubmitted=5000
Как вы можете видеть, среди ужасного беспорядка других заголовков (я прошу прощения за это) есть Content-Type
заголовок, который определяет MIME-тип содержимого в теле HTTP, обычно это application/x-www-form-urlencoded
для POST-форм, это тот, который вы видите в HTTP-запросе выше.
Здесь тело содержит данные формы (разделенные amp;
символом) из следующей формы:
<form action="/index.php" method="POST">
<input type="text" id="fname" name="fname" value=""><br>
<input type="text" id="lname" name="lname" value=""><br>
<input type="hidden" id="formsubmitted" name="formsubmitted" value="5000"><br>
<input type="submit" value="Submit">
</form>
Еще один, который используется multipart/form-data
, — это ссылка на MIME-ссылку на developer.mozzila.com : «Как формат документа, состоящий из нескольких частей, он состоит из разных частей, разделенных границей (строка, начинающаяся с двойного тире -). Каждая часть является отдельной сущностью со своими собственными HTTP-заголовками, полями Content-Disposition и Content-Type для загрузки файлов.», это определение также включает следующий пример:
Content-Type: multipart/form-data; boundary=aBoundaryString
(other headers associated with the multipart document as a whole)
--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg
(data)
--aBoundaryString
Content-Disposition: form-data; name="myField"
(data)
--aBoundaryString
(more subparts)
--aBoundaryString--
Хотя я никогда не сталкивался multipart/form-data
с типом MIME, вы должны подтвердить это при работе с POST HTTP-запросами
Что касается более подробного ответа на ваш другой вопрос «Также, что такое application /x-www-form-urlencoded в заголовке?» application/x-www-form-urlencoded
является типом MIME, urlencoded в нем означает, что данные формы кодируются так же, как и в запросе GET, каждое поле разделяется amp;
символом, а поля имеют формат name=value
И к тому, что вы написали «Я знаю, что http-запрос состоит из [метода] [заголовка] [URL] [Параметров] [Тела]», это неправильно, HTTP-запрос состоит из них, но не в этом порядке, фактический порядок таков:
Method Requested_Resource(and GET parameters if any) HTTP_Version rn
Headers ('rn' after each header)
rn
Body
Ответ №2:
Данные формы действительно отправляются в теле.
application/x-www-form-urlencoded
это формат формы. Это задается в Content-Type
заголовке.
Другой формат multipart/form-data
, который обычно используется, если в форме есть поле для загрузки файла.