FormData против строки запроса

#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 , который обычно используется, если в форме есть поле для загрузки файла.