Hoe worden parameters verzonden in een HTTP POST-verzoek?

In een HTTP GET-verzoek worden parameters verzonden als een querystring:

http://example.com/page?parameter=value&also=another

In een HTTP POST-verzoek worden de parameters niet samen met de URI verzonden.

Waar zijn de waarden? In de verzoekkop? In de aanvraaginstantie? Hoe ziet het eruit?


Antwoord 1, autoriteit 100%

De waarden worden verzonden in de hoofdtekst van het verzoek, in het formaat dat het inhoudstype specificeert.

Meestal is het inhoudstype application/x-www-form-urlencoded, dus de hoofdtekst van het verzoek gebruikt hetzelfde formaat als de queryreeks:

parameter=value&also=another

Als je een bestandsupload in het formulier gebruikt, gebruik je in plaats daarvan de multipart/form-data-codering, die een ander formaat heeft. Het is ingewikkelder, maar het maakt je meestal niet uit hoe het eruit ziet, dus ik zal geen voorbeeld laten zien, maar het kan goed zijn om te weten dat het bestaat.


Antwoord 2, autoriteit 33%

De inhoud wordt achter de HTTP-headers geplaatst. Het formaat van een HTTP POST is om de HTTP-headers te hebben, gevolgd door een lege regel, gevolgd door de hoofdtekst van de aanvraag. De POST-variabelen worden opgeslagen als sleutel-waardeparen in de hoofdtekst.

Je kunt dit zien in de onbewerkte inhoud van een HTTP-bericht, hieronder weergegeven:

POST /path/script.cgi HTTP/1.0
From: [email protected]
User-Agent: HTTPTool/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
home=Cosby&favorite+flavor=flies

Je kunt dit zien met behulp van een tool zoals Fiddler, die je kunt gebruiken om de onbewerkte HTTP-verzoeken en responspayloads te bekijken die over de draad.


Antwoord 3, autoriteit 31%

Kort antwoord: in POST-verzoeken worden waarden verzonden in de “body” van het verzoek. Bij webformulieren worden ze hoogstwaarschijnlijk verzonden met het mediatype application/x-www-form-urlencoded of multipart/form-data. Programmeertalen of frameworks die zijn ontworpen om webverzoeken af ​​te handelen, doen meestal “The Right Thing ” met dergelijke verzoeken en bieden u gemakkelijke toegang tot de gemakkelijk gedecodeerde waarden (zoals $_REQUEST of $_POST in PHP, of cgi.FieldStorage(), flask.request.form in Python).


Laten we nu een beetje afdwalen, dat kan helpen om het verschil te begrijpen 😉

Het verschil tussen GET– en POST-verzoeken is grotendeels semantisch. Ze worden ook anders “gebruikt”, wat het verschil verklaart in de manier waarop waarden worden doorgegeven.

GET (relevante RFC-sectie)

Bij het uitvoeren van een GET-verzoek, vraagt ​​u de server om één of een reeks entiteiten. Om de klant in staat te stellen het resultaat te filteren, kan hij de zogenaamde “query string” van de URL gebruiken. De querystring is het deel na de ?. Dit maakt deel uit van de URI-syntaxis.

Dus vanuit het oogpunt van uw applicatiecode (het deel dat het verzoek ontvangt), moet u het URI-querygedeelte inspecteren om toegang te krijgen tot deze waarden.

Houd er rekening mee dat de sleutels en waarden deel uitmaken van de URI. Browsers kunnen een limiet stellen aan de lengte van de URI. De HTTP-standaard stelt dat er geen limiet is. Maar op het moment van schrijven beperken de meeste browsers de URI’s wel (ik heb geen specifieke waarden). GET-verzoeken mogen nooit worden gebruikt om nieuwe informatie naar de server te verzenden. Zeker geen grotere documenten. Dat is waar je POST of PUT moet gebruiken.

POST (relevante RFC-sectie)

Bij het uitvoeren van een POST-verzoek, dient de client feitelijk een nieuw document in bij de externe host. Dus een query string is (semantisch) niet logisch. Daarom heb je er geen toegang toe in je sollicitatiecode.

POST is iets complexer (en veel flexibeler):

Als je een POST-verzoek ontvangt, moet je altijd een “payload” verwachten, of, in HTTP-termen: een berichttekst. De berichttekst zelf is vrij nutteloos, aangezien er geen standaard (voor zover ik weet. Misschien applicatie/octet-stream?) formaat is. De body-indeling wordt gedefinieerd door de kop Content-Type. Bij gebruik van een HTML FORM element met method="POST", is dit meestal application/x-www-form-urlencoded. Een ander veel voorkomend type is multipart/form-data als je bestandsuploads gebruikt. Maar het kan alles zijn, variërend van text/plain, over application/json of zelfs een aangepaste application/octet-stream.

In elk geval, als een POST-verzoek wordt gedaan met een Content-Type dat niet kan worden verwerkt door de applicatie, moet het een 415 statuscode.

De meeste programmeertalen (en/of web-frameworks) bieden een manier om de berichttekst te decoderen/coderen van/naar de meest voorkomende typen (zoals application/x-www-form-urlencoded, multipart/form-data of application/json). Dus dat is makkelijk. Aangepaste typen vereisen mogelijk wat meer werk.

Met een standaard HTML-formulier gecodeerd document als voorbeeld, zou de toepassing de volgende stappen moeten uitvoeren:

  1. Lees het veld Content-Type
  2. Als de waarde niet een van de ondersteunde mediatypen is, retourneer dan een reactie met een 415 statuscode
  3. Decodeer anders de waarden uit de berichttekst.

Nogmaals, talen zoals PHP of web-frameworks voor andere populaire talen zullen dit waarschijnlijk voor je regelen. De uitzondering hierop is de 415-fout. Geen enkel framework kan voorspellen welke content-types uw applicatie wel en/of niet ondersteunt. Dit is aan jou.

PUT (relevante RFC-sectie)

Een PUT-verzoek wordt ongeveer op exact dezelfde manier afgehandeld als een POST-verzoek. Het grote verschil is dat een POST-verzoek de server moet laten beslissen hoe (en als dat al gebeurt) een nieuwe bron aan te maken. Historisch gezien (vanaf de nu verouderde RFC2616 was het om een ​​nieuwe bron te creëren als een “ondergeschikte” (onderliggende) van de URI waar het verzoek naartoe werd gestuurd).

Een PUT-verzoek daarentegen wordt verondersteld een bron precies op die URI te “deponeren”, en met precies die inhoud. Niet meer niet minder. Het idee is dat de klant verantwoordelijk is om de complete bron te maken voordat deze wordt “PUT”. De server moet het as-is accepteren op de opgegeven URL.

Als gevolg hiervan wordt een POST-verzoek meestal niet gebruikt om een ​​bestaande bron te vervangen. Een PUT-verzoek kan zowel en vervangen.

Kanttekening

Er zijn ook “padparameters” die kunnen worden gebruikt om aanvullende gegevens naar de afstandsbediening, maar ze zijn zo ongewoon, dat ik hier niet te veel in detail zal treden. Maar ter referentie, hier is een fragment uit de RFC:

Afgezien van puntsegmenten in hiërarchische paden, wordt een padsegment beschouwd
ondoorzichtig door de generieke syntaxis. URI-producerende toepassingen gebruiken vaak de
gereserveerde tekens toegestaan ​​in een segment om schema-specifiek af te bakenen of
dereferentie-handler-specifieke subcomponenten. Bijvoorbeeld de puntkomma (“;”)
en is gelijk aan (“=”) gereserveerde tekens worden vaak gebruikt om parameters af te bakenen en
parameterwaarden die van toepassing zijn op dat segment. De komma (“,”) gereserveerd
karakter wordt vaak voor soortgelijke doeleinden gebruikt. Bijvoorbeeld één URI-producent
kan een segment zoals “name;v=1.1” gebruiken om een ​​verwijzing naar versie aan te geven
1.1 van “naam”, terwijl een ander een segment zoals “naam,1.1” zou kunnen gebruiken om
hetzelfde aangeven. Parametertypes kunnen worden gedefinieerd door schemaspecifiek
semantiek, maar in de meeste gevallen is de syntaxis van een parameter specifiek
aan de implementatie van het URI’s dereferentie-algoritme.


Antwoord 4, autoriteit 5%

Je kunt het niet rechtstreeks in de browser-URL-balk typen.

U kunt zien hoe POST-gegevens op internet worden verzonden met Live HTTP-headers bijvoorbeeld.
Het resultaat zal zoiets zijn

http://127.0.0.1/pass.php
POST /pass.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://127.0.0.1/pass.php
Cookie: passx=87e8af376bc9d9bfec2c7c0193e6af70; PHPSESSID=l9hk7mfh0ppqecg8gialak6gt5
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
username=zurfyx&pass=password

Waar staat

Content-Length: 30
    username=zurfyx&pass=password

zijn de postwaarden.


Antwoord 5, autoriteit 2%

Het standaard mediatype in een POST-verzoek is application/x-www-form-urlencoded. Dit is een indeling voor het coderen van sleutel-waardeparen. De sleutels kunnen dubbel zijn. Elk sleutel/waarde-paar wordt gescheiden door een teken & en elke sleutel wordt gescheiden van zijn waarde door een teken =.

Bijvoorbeeld:

Name: John Smith
Grade: 19

Is gecodeerd als:

Name=John+Smith&Grade=19

Dit wordt in de hoofdtekst van het verzoek geplaatst na de HTTP-headers.


Antwoord 6

Voor sommige webservices moet u gegevens en metagegevens afzonderlijk plaatsen. Een externe functie kan bijvoorbeeld verwachten dat de ondertekende metadata-string is opgenomen in een URI, terwijl de data in een HTTP-body wordt gepost.

Het POST-verzoek kan er semantisch als volgt uitzien:

POST /?AuthId=YOURKEY&Action=WebServiceAction&Signature=rcLXfkPldrYm04 HTTP/1.1
Content-Type: text/tab-separated-values; charset=iso-8859-1
Content-Length: []
Host: webservices.domain.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: identity
User-Agent: Mozilla/3.0 (compatible; Indy Library)
name    id
John    G12N
Sarah   J87M
Bob     N33Y

Deze aanpak combineert logischerwijs QueryString en Body-Post met behulp van een enkel Content-Type wat een “parsing-instructie” is voor een webserver.

Let op: HTTP/1.1 is omhuld met de #32 (spatie) aan de linkerkant en met #10 (regelinvoer) aan de rechterkant.


Antwoord 7

Formulierwaarden in HTTP POST’s worden verzonden in de hoofdtekst van het verzoek, in hetzelfde formaat als de querystring.

Zie voor meer informatie de specificatie.


Antwoord 8

Laten we eerst een onderscheid maken tussen GET en POST

Get: dit is het standaard HTTP-verzoek dat aan de server wordt gedaan en wordt gebruikt om de gegevens op te halen van de server en de queryreeks die na ? in een URI wordt gebruikt om een ​​unieke bron op te halen.

dit is het formaat

GET /someweb.asp?data=value HTTP/1.0

hier data=value is de waarde van de queryreeks die is doorgegeven.

POST: het wordt gebruikt om gegevens veilig naar de server te verzenden, dus alles wat nodig is, dit is het formaat van een POST-verzoek

POST /somweb.aspHTTP/1.0
Host: localhost
Content-Type: application/x-www-form-urlencoded //you can put any format here
Content-Length: 11 //it depends
Name= somename

Waarom POST boven GET?

In GET wordt de waarde die naar de servers wordt verzonden meestal toegevoegd aan de basis-URL in de queryreeks, nu zijn er 2 gevolgen hiervan

  • De GET-verzoeken worden met de parameters in de browsergeschiedenis opgeslagen. Uw wachtwoorden blijven dus onversleuteld in de browsergeschiedenis. Dit was vroeger een echt probleem voor Facebook.
  • Meestal hebben servers een limiet voor hoe lang een URI mag zijn. Als er te veel parameters worden verzonden, ontvangt u mogelijk 414 Error - URI too long

In het geval van een postverzoek worden uw gegevens uit de velden in plaats daarvan aan de body toegevoegd. De lengte van de verzoekparameters wordt berekend en toegevoegd aan de koptekst voor de lengte van de inhoud en er worden geen belangrijke gegevens rechtstreeks aan de URL toegevoegd.

U kunt het netwerkgedeelte van de Google Developer Tools gebruiken om basisinformatie te zien over hoe verzoeken aan de servers worden gedaan.

en u kunt altijd meer waarden toevoegen aan uw Request Headers zoals Cache-Control , Origin , Accept .

LEAVE A REPLY

Please enter your comment!
Please enter your name here

16 + 19 =

Other episodes