14. Laravel restapi bangla tutorial (Laravel Passport) #restapi #pass

Kan vi ikke implementere HTTP-protokollen ved kun at bruge et anmodningsorgan og et svarorgan?

For eksempel vil URL'en indeholde anmodning, som kortlægges til en funktion afhængigt af programmeringssprog på serversiden, siger en Servlet, og som svar HTML og JavaScript-svar vil blive sendt på tværs.

Hvorfor har HTTP-protokol idé om metoder?

Fra svarene får jeg en fornemmelse af, hvorfor begrebet metoder er der..Dette fører til et andet relateret spørgsmål:

For eksempel i gmail-komponentlink sendes PUT / POST-anmodningen og dataene. Hvordan lærer browseren, hvilken metode der skal bruges? Indeholder gmail-siden, der sendes af serveren, det metodenavn, der skal bruges, når du ringer til gmail compose-anmodning? når vi ringer til www.gmail.com, skal det bruge GET-metoden. Hvordan ved browseren, at denne metode skal bruges?

PS : Jeg har ikke nok kreditter til at kommentere svar, så jeg er ikke i stand til at kommentere mange spørgsmål rejst af mennesker relateret til intention bag dette spørgsmål.

Som nogle svar fortæller, kan vi oprette nye brugere på DELETE-metoden, så rejser dette spørgsmål om hensigten bag opfattelsen af ​​metoder i http-protokol, for i slutningen af ​​dagen afhænger det helt af servere, hvilken funktion de vil kortlægge en URL til . Hvorfor skal klienten fortælle servere, hvilke metoder der skal bruges til en URL.

  • Ja og nej. Dit spørgsmål er i konflikt med sig selv, da du siger, at du vil vide, hvordan man laver HTTP-anmodninger uden at bruge HTTP, men jeg tror, ​​jeg får det, du prøver at gøre. Det vil sige GET- og POST-data uden at bruge en browser, men gør det programmatisk. Er det korrekt?
  • 4 Jeg spekulerer på, spørger du, om HTTP kunne have været defineret uden metoder, dvs. den historiske begrundelse for dem; eller hvis protokollen, som den i øjeblikket er, kunne bruges uden dem, dvs. ville droppemetoder være inden for den eksisterende specifikation?
  • @ilkkachu: Hvorfor har klienten brug for at fortælle serveren, hvordan man udfører noget. Klienten vil kun anmode om en URL og ved hjælp af URL, for eksempel kan serveren kortlægge den til en funktion, siger servlet og give svaret tilbage. Hvorfor skal kunden nogensinde have brug for at give, hvordan man udfører noget?
  • 1 @ user104656, hvis det er et svar på mit spørgsmål, er jeg stadig ikke sikker på, om du mener det originale design eller den aktuelle situation. (Jeg sagde ikke, at det har brug for eller ikke har brug for det.)
  • @Mars og andre: For eksempel i gmail-komponentlink sendes PUT / POST-anmodningen og data. Hvordan lærer browseren, hvilken metode der skal bruges? Indeholder gmail-siden, der sendes af serveren, det metodenavn, der skal bruges, når du ringer til gmail compose-anmodning? når vi ringer til www.gmail.com, skal det bruge GET-metoden. Hvordan ved browseren, at denne metode skal bruges?

Bemærk venligst spørgsmålet er ændret / blevet afklaret, siden dette svar blev skrevet første gang. Et yderligere svar på den seneste iteration af spørgsmålet er efter den anden vandrette regel

Hvad er behovet for metoder som GET og POST i HTTP-protokollen?

De sammen med et par andre ting som headerformater, regler for hvordan overskrifter og kroppe adskilles, danner grundlaget for HTTP-protokollen

Kan vi ikke implementere HTTP-protokollen ved kun at bruge et anmodningsorgan og et svarorgan?

Nej, for alt hvad du oprettede, ville ikke være HTTP-protokollen

For eksempel vil URL'en indeholde anmodning, som kortlægges til en funktion afhængigt af programmeringssprog på serversiden, siger en Servlet, og som svar HTML og JavaScript-svar vil blive sendt på tværs.

Tillykke, du opfandt netop en ny protokol! Hvis du nu vil oprette et standardorgan til at drive og vedligeholde det, udvikle det osv., Kan det overhale HTTP en dag

Jeg sætter pris på, at dette er lidt tunge i kinden, men der er ikke noget magisk ved internettet, TCP / IP eller den kommunikation, der foregår mellem servere og klienter. Du åbner en forbindelse og sender nogle ord ned ad ledningen og danner en samtale. Samtalen skal virkelig overholde nogle ratificerede specifikationer i begge ender, hvis anmodningerne skal forstås og fornuftige svar leveres. Dette adskiller sig ikke fra nogen dialog i verden. Du taler engelsk, din nabo taler kinesisk. Forhåbentlig vil din hånd, der vinker, peger og knytter til knytnæve, være tilstrækkelig til at formidle dit budskab om, at du ikke vil have ham til at parkere sin bil foran dit hus.

Tilbage på internettet, hvis du åbner et stik til en webserver, der er HTTP-kompatibel og sender følgende:

EHLO AUTH LOGIN 

(Starten af ​​en SMTP-e-mail-transmission), så får du ikke et fornuftigt svar. Du kan skabe den mest perfekte SMTP-kompatible klient, men din webserver vil ikke tale med det, fordi denne samtale handler om den delte protokol - ingen delt protokol, ingen glæde.

Dette er grunden til, at du ikke kan implementere HTTP-protokollen uden at implementere HTTP-protokollen; hvis det, du skriver, ikke er i overensstemmelse med protokollen, så er det simpelthen ikke protokollen - det er noget andet, og det fungerer ikke som specificeret i protokollen

Hvis vi løber med dit eksempel et øjeblik; hvor klienten forbinder og bare angiver noget, der ligner en URL .. Og serveren forstår det og sender bare noget, der ligner HTML / JS (en webside), så det kan sikkert fungere. Hvad gemte du dog? Et par byte om ikke at sige FÅ? Få mere om at droppe de irriterende overskrifter .. Serveren gemte også nogle - men hvad hvis du ikke kan finde ud af, hvad den sendte dig? Hvad hvis du bad om en URL, der sluttede i JPEG, og den sendte dig nogle bytes, der skabte et billede, men det er i PNG? En ufuldstændig PNG på det. Hvis vi kun havde et header, der sagde, hvor mange byte det var går at sende, så ville vi vide, om antallet af bytes, vi modtog, faktisk var hele filen eller ej. Hvad hvis serveren gzipede svaret for at gemme noget båndbredde, men ikke fortalte dig det? Du kommer til at bruge en betydelig computerkraft på at prøve at finde ud af, hvad den sendte.

I slutningen af ​​dagen, vi brug for metainformation - information om information; vi har brug for overskrifter; vi har brug for filer for at have navne, udvidelser, oprettede datoer. Vi har brug for, at folk har fødselsdage, for at sige tak og tak osv. - Verden er fuld af protokoller og lidt information om konteksten, så vi ikke behøver at sætte os ned og arbejde alt fra bunden hele tiden. Det koster lidt lagerplads, men det er let det værd


Er det virkelig nødvendigt at implementere forskellige HTTP-metoder?

Formentlig behøver man ikke implementere hele den specificerede protokol, og dette gælder normalt for noget. Jeg kender ikke hvert ord på engelsk; min kinesiske nabo er også softwareudvikler, men i en anden branche, og han kender ikke engang kineserne for nogle af de udtryk, der bruges i min branche, endsige engelsk. Den gode ting er dog, at vi begge kan hente et dokument om implementeringen af ​​HTTP, han kan skrive serveren, og jeg kan skrive klienten på forskellige programmeringssprog på forskellige arkitekturer, og de fungerer stadig, fordi de overholder protokollen

Det kan meget vel være tilfældet, at ingen af ​​dine brugere nogensinde vil udstede andet end en GET-anmodning, ikke vil bruge vedvarende forbindelser, sende andet end JSON som brødtekst eller har brug for at acceptere andet end tekst / almindeligt, så du kunne skriv en rigtig pareret webserver, der kun opfylder de meget begrænsede krav fra klientbrowseren. Men du kunne ikke bare vilkårligt beslutte at fjerne de grundlæggende regler, der gør "noget tekst, der passerer et stik", hvad HTTP er; du kan ikke droppe den grundlæggende forestilling om, at anmodningen vil være en streng som:

VERB URL VERSION header: value maybe_body 

Og svaret har en version og statuskode og måske overskrifter. Hvis du ændrer noget af det - det er ikke HTTP mere - det er noget andet og fungerer kun med noget, der er designet til at forstå det. HTTP er, hvad det er ved disse definitioner, så hvis du vil implementere det, skal du følge definitionerne


Opdatering

Dit spørgsmål har udviklet sig en smule, her er et svar på hvad du stiller:

Hvorfor har HTTP-protokol idé om metoder?

Historisk skal du forstå, at tingene var meget mere ufleksible i deres design og implementering, selv i det omfang scripting ikke eksisterede, og endda tanken om, at sider kunne være dynamiske, genereret i farten i hukommelsen og skubbede stikket ned i stedet at være en statisk fil på disk, der blev anmodet om af klienten og læst og skubbet ned i soklen, eksisterede ikke. Som sådan var det meget tidlige web centreret omkring begrebet statiske sider, der indeholdt links til andre sider, alle siderne eksisterede på disken, og navigation ville have været ved terminalen, der for det meste lavede GET-anmodninger om sider på URL'er, serveren ville være i stand til at kortlægge url til en fil på disken og send den. Der var også denne opfattelse, at dokumentnettet, der linkede til hinanden og ud til andre steder, skulle være en ting, der kan udvikles, så det var fornuftigt, at der eksisterede en række metoder, der gjorde det muligt for kvalificerede tilladte brugere at opdatere internettet uden nødvendigvis have adgang til serverfilsystemet, brug brugssagen til lignende som PUT og SLET, og andre metoder som HEAD returnerede bare metaoplysninger om et dokument, så klienten kunne beslutte, om han skulle FÅ det igen (husk, at vi taler om dage med opkaldsmodemer, virkelig primitiv langsom teknologi. Det kunne være en stor besparelse at få meta på en halv megabyte fil og se, at den ikke havde ændret sig, og servere den lokale kopi fra cachen i stedet for at downloade igen

Det giver en vis historisk kontekst for metoderne - engang var URL'en den ufleksible bit og henviste forenklet til sider på disken, så metoden var nyttig, fordi den tillod klienten at beskrive, hvad den havde til hensigt for filen, og serveren ville behandle metoden på en eller anden måde. Der var ikke rigtig en forestilling om, at webadresser var virtuelle eller blev brugt til at skifte eller kortlægge i den oprindelige vision af en hypertekst (og det var virkelig kun tekst)

Jeg har ikke til hensigt, at dette svar skal være en dokumentation for den historiske optegnelse med datoer og citerede referencer for nøjagtigt, hvornår tingene begyndte at ændre sig - til det kan du sandsynligvis læse Wikipedia - men det er tilstrækkeligt at sige, at ønsket om web for at være mere samlet momentum og i hver ende af server-klientforbindelsen mulighederne for at skabe en rig multimedieoplevelse, vi udvider. Browsere understøttede en enorm spredning af tags til formatering af indhold, hver kæmper for at implementere must-have mediefyldighedsfunktioner og nye måder at få ting til at se snazzy ud.

Scripting ankom til klientenden og plugins og browserudvidelser, alt sammen med det formål at gøre browseren til et meget kapabelt kraftværk af alt. Ved serverens ende var aktiv generering af indhold baseret på algoritmer eller databasedata det store skub, og det fortsætter med at udvikle sig i den grad, at der sandsynligvis er få filer på disken mere - det er sikkert, vi holder et billede eller en scriptfil som en fil på webserveren og få browseren FÅ den, men i stigende grad er de billeder, browseren viser, og de scripts, den kører, ikke filer, du kan åbne i din filudforsker, de genererer indhold, der er resultatet af en kompileringsproces, der udføres efter behov , SVG, der beskriver, hvordan man tegner pixels i stedet for et bitmap-array af pixels eller JavaScript, der blev udsendt fra et højere niveau af script som TypeScript

Ved at lave moderne multi megabyte sider er sandsynligvis kun en brøkdel af det nu fast indhold på en disk; databasedata er formateret og formet til html, som browseren vil forbruge, og det udføres af serveren som svar på flere forskellige programmeringsrutiner, der henvises til på en eller anden måde af url

Jeg nævnte i kommentarerne til spørgsmålet, at det ligner fuld cirkel. Tilbage, når computere kostede hundreder af tusinder og fyldte rum, var det almindeligt at tillade flere brugere at bruge den superkraftige centrale mainframe ved hjælp af hundreder af dumme terminaler - et tastaturkort og en mus, en grøn skærm, send tekst ind, få noget tekst ud. I løbet af tiden, da computerkraften steg, og priserne faldt, begyndte folk at ende med skrivebordscomputere, der var mere kraftfulde end tidlige mainframes og muligheden for at køre kraftige apps lokalt, så mainframe-modellen blev forældet. Det gik dog aldrig væk, fordi tingene bare udviklede sig til at skifte anden vej og noget vende tilbage til en central server, der leverer det meste af den nyttige appfunktionalitet og hundrede klientcomputere, der gør meget lidt undtagen at tegne på skærmen og indsende og modtage data til / fra serveren. Den midlertidige periode, hvor din computer var smart nok til at køre sin egen kopi af word og outlook på samme tid, har igen vundet plads til office online, hvor din browser er en enhed til at tegne billeder på skærmen og redigere dokumentet / e-mailen til dig ' omskrivning som en ting, der bor på serveren, gemmes der, sendes og deles med andre brugere alt sammen som forestillingen om, at browseren bare er en skal, der til enhver tid giver en delvis visning af denne ting, der bor andre steder

Fra svarene får jeg en fornemmelse af, hvorfor begrebet metoder er der..Dette fører til et andet relateret spørgsmål:

For eksempel i gmail-komponentlink sendes PUT / POST-anmodningen og dataene. Hvordan lærer browseren, hvilken metode der skal bruges?

Det bruger GET som standard, ved konvention / spec, da det er det, der er foreskrevet, skal ske, når du skriver en url og trykker på retur

Indeholder gmail-siden, der sendes af serveren, det metodenavn, der skal bruges, når du ringer til gmail compose-anmodning?

Dette er en af ​​de vigtigste ting, jeg henviser til i kommentarerne ovenfor. På det moderne web handler det ikke engang mere om sider. Når sider var filer på disken, skulle browseren FÅ. Derefter blev de sider, der overvejende blev genereret dynamisk ved at indsætte data i en skabelon. Men det involverede stadig en "anmod om en ny side fra serveren, få en side, vis side" -proces. Sidebytte blev virkelig glat; du så dem ikke indlæse og ændre størrelse og ryste deres layout rundt, så det blev jævnere, men det var stadig browseren, der erstattede en hel side eller en del af en side med en anden

Den moderne måde at gøre tingene på er med en enkelt sideapplikation; browseren har et dokument i hukommelsen, der vises på en bestemt måde, scripting kalder til serveren og får noget nugget af information tilbage og manipulerer dokumentet, så en del af siden ændres visuelt for at vise den nye info - det hele kører uden at browseren nogensinde indlæser endnu en ny side; det er bare blevet et brugergrænseflade, hvor dele af det opdateres ligesom en typisk klientapp som word eller outlook. Nye elementer vises oven på andre elementer og kan trækkes rundt ved at simulere dialogvinduer osv. Alt dette Er browsermonteringsmotoren, der sender anmodninger ved hjælp af den http-metode, som udvikleren ønsker, får data tilbage og stikker på det dokument, som browseren tegner. Du kan forestille dig, at den moderne browser er en strålende enhed, der ligner et helt operativsystem eller en virtuel computer; en programmerbar enhed, der har en ret standardiseret måde at tegne ting på skærmen, afspille lyd, fange brugerinput og sende det til behandling. Alt hvad du skal gøre for at få det til at tegne dit brugergrænseflade er at give det noget html / css, der gør et brugergrænseflade, og derefter tilpasse html konstant for at få browseren til at ændre det, den tegner. Heck, folk er så vant til at se adresselinjens ændring / bruge den som en hensigtsretning, at en enkelt side-app ændrer url'en programmatisk, selvom der ikke foretages nogen navigation (der anmoder om helt nye sider)

når vi ringer til www.gmail.com, skal det bruge GET-metoden. Hvordan ved browseren, at denne metode skal bruges?

Det er virkelig en GET. Fordi det er specificeret. Den første anmodning er, som det historisk altid har været - FÅ noget indledende html til at tegne et brugergrænseflade, derefter enten poke og manipulere det for evigt, eller få en anden side med andet script, der pokker og manipulerer og gør et responsivt reaktivt brugergrænseflade

Som nogle svar fortæller, kan vi oprette nye brugere på DELETE-metoden, så rejser dette spørgsmål om hensigten bag opfattelsen af ​​metoder i http-protokol, for i slutningen af ​​dagen afhænger det helt af servere, hvilken funktion de vil kortlægge en URL til . Hvorfor skal klienten fortælle servere, hvilke metoder der skal bruges til en URL.

Historie. Eftermæle. Vi kunne teoretisk kaste alle http-metoderne ud i morgen - vi er på et programmeringssofistikationsniveau, hvor metoderne er forældede, fordi webadresser kan behandles, i det omfang de kan være den skiftemekanisme, der angiver til serveren, at du vil gemme dataene i kroppen som en kladde-e-mail, eller slet et kladde - der er ikke en / emails / kladde / gem / 1234-fil på serveren - serveren er programmeret til at vælge den url fra hinanden og vide, hvad de skal gøre med kropsdataene - gem det som en kladdemail under id 1234

Så det er bestemt muligt at fjerne metoder, bortset fra den enorme vægt af arvskompatibilitet, der voksede op omkring dem. Det er bedre at bare bruge dem til det, du har brug for, men stort set ignorere dem og i stedet bruge det, du har brug for, for at få dine ting til at fungere. Vi har stadig brug for metoder som specificeret, fordi du skal huske, at de betyder noget for browseren og serveren, som vi har oprettet vores apps på. Skriften på klientsiden ønsker at bruge den underliggende browser til at sende data, den skal bruge en metode, der får browseren til at gøre som den beder - sandsynligvis en POST, fordi GET pakker al sin variable info ind i url'en, og der er en begrænsning på længden i mange servere. Klienten ønsker et langt svar fra serveren - brug ikke et HEAD, fordi de overhovedet ikke skal have responsorganer. Måske har din valgte browser og server ingen begrænsninger, men måske en dag vil de hver især støde på en anden implementering i den anden ende, der gør det - og i ånden af ​​interoperation holder det sig til en specifikation, at det fungerer bedre

  • 1 Jeg fik et flashback fra "hvis det, du skriver ikke stemmer overens med protokollen, så er det simpelthen ikke protokollen" til nogen, der fortalte mig, at de havde en "husregel" til at spille skak uden kastling eller en-passant bondeoptagelser . Jeg sagde noget som "det er et interessant spil, men det er ikke 'skak' uden disse regler." Skift spillereglerne, og det er ikke det samme spil længere.
  • 5 Du skrev cirkler om, hvordan det ikke ville være den aktuelle HTTP uden metoderne eller overskrifterne (mens spørgsmålet egentlig ikke sagde noget om overskrifter), men du siger aldrig, hvad metoderne er til, og om en protokol fungerer til de samme formål uden metoder - hvilket er hvad spørgsmålet handlede om.
  • 1 Hvorfor skal jeg sige, hvad metoderne er "til"? Der er et spec dokument for det. HTTP er ikke noget magisk, heller ikke FTP eller SMTP eller RTMP - de er bare bare byte, der går ned i en stikkontakt, men det er rækkefølgen, præsentationen, de regler (protokol) som byte er i overensstemmelse med, der gør protokollen til den er. Du har læst noget i det spørgsmål, jeg ikke gjorde, men jeg har heller ikke noget imod at besvare dit spørgsmål: kan man lave en protokol uden metoder? - ikke rigtig, men det afhænger af, hvad du mener med metoder. HTTP er den eneste protokol med HTTP-metoder, men alle de protokoller, jeg kan tænke på, har ..
  • ..foreskrevne interaktionsmønstre, som jeg vil henvise til som metoder; uden dem ville de ikke være en protokol, og de ville ikke være i stand til at opnå pålidelig inter-proces / inter-system kommunikation.
  • Faktisk sagde jeg, at der er et spec-dokument, der siger, hvad metoderne er "til" - det er ikke nødvendigvis sandt; metoderne behøver ikke at være "til" noget; vi kan oprette en webservice, der sletter ting som svar på en GET og opretter nye brugere som svar på en SLET. Der er ingen obligatorisk adfærd for en metode, de eksisterer bare, fordi de er specificeret. Systemer er bygget oven på protokoller, fordi det fjerner noget af det hårde arbejde (vi behøver ikke opfinde en protokol såvel som et system, der bruger den), men når vi kontrollerer begge sider, hvilke aspekter af protokollen bruges ( for) er ret vilkårlig

HTTP kan betragtes som et specifikt tilfælde af generiske principper for Remote Procedure Call: du fortæller serveren, hvad du vil have med et variabelt felt i anmodningen, serveren svarer i overensstemmelse hermed. På nuværende tidspunkt, på grund af den komplekse interaktivitet af 'Web 2.0', skubbes de samme funktioner i hvert felt på anmodningen: URL'en, overskrifterne, kroppen - og hver appserver og app forstår dem på deres egen måde. Oprindeligt var internettet imidlertid enklere, brugte statiske sider, og man troede, at HTTP-metoderne sørgede for det niveau af interaktivitet, der ville være tilstrækkelig. Især har HTTP masser af metoder, der sjældent eller aldrig bruges, hvor nogle kun ser lyset takket være REST. F.eks. PUT og DELETE var døende før REST, og TRACE og PATCH er stadig usynlige. Takeaway er, at HTTPs model af RPC ikke helt matchede de apps, der fulgte, og apps implementerede deres egen model med bare GET og POST - men HTTP kunne ikke kastes på det tidspunkt.

REST gjorde det nøjagtige modsatte af det, du foreslår, ved at bemærke, at HTTP-metoderne tjener de typiske CRUD-anvendelsestilfælde for de fleste apps, hvis PUT og SLET bringes tilbage.

Bemærk også, at der er tildelt semantik til HTTP-metoder, der respekteres af browsere og middleware som proxyservere: POST, PUT, SLET og PATCH-anmodninger kan have bivirkninger og sandsynligvis ikke være idempotente, så apps på klientsiden og middleware tager forsigtighed for ikke at fyre disse anmodninger uden udtrykkelig handling fra brugeren. I praksis brugte dårligt designede webapps GET til ikke-sikre handlinger, og f.eks. Google Web Accelerator-forhængeren forårsagede problemer ved at slette en række data på sådanne websteder, så dens beta blev suspenderet kort efter lanceringen.

Så for at besvare 'kan vi' spørgsmålet: helt sikkert, du skal bare blive enige om en protokol, der fortæller serverappen, hvilken handling du vil udføre, og derefter placerer du argumenterne et eller andet sted i URL / body - som f.eks. målelement for handlingen. Sættet af handlinger er kun afgrænset af specifikke apps, så du har brug for en udvidelig protokol. Men du bliver nødt til at lade klientapps vide, hvilke anmodninger der er sikre, og sandsynligvis tage andre nuancer i betragtning, såsom cache-kontrol.

  • 4 "PUT og DELETE var døende før REST" Ikke sandt. Hvordan tror du, WebDAV fungerede?
  • 3 @PatrickMevzek Ja, men blev WebDav brugt af nok folk til at betragte dem som levende i stedet for i koma? ^^
  • 1 @PatrickMevzek WebDAV er praktisk talt en separat protokol fra HTTP.
  • @duskwuff tools.ietf.org/html/rfc4918 "HTTP-udvidelser til webdistribueret redigering og versionering (WebDAV)". Ikke så adskilt, det er klart oven på det.
  • 1 PATCH bruges af REST til at indikere en delvis ændring (aka opdatering).

Fra min personlige synsvinkel som udvikler kan det gøre oprettelse af API-slutpunkter meget lettere. For eksempel hvis jeg skriver en controller, der administrerer produkter på et websted, kan jeg bruge den samme URL til at udføre flere forskellige operationer.

Eksempler:

GET https://example.com/api/products/1234 

Dette henter detaljerne i produkt 1234.


POST https://example.com/api/products/1234 

Dette opretter et produkt med ID 1234 ved hjælp af data i anmodningsorganet.


PUT https://example.com/api/products/1234 

Dette opdaterer produkt 1234 med data i anmodningsorganet.


DELETE https://example.com/api/products/1234 

Dette sletter et produkt med ID 1234.


Jeg kunne lave forskellige slutpunkter for hver operation, men det ville komplicere processen og gøre det mindre forståeligt for andre udviklere.

  • 1 Dette svarer ikke på det nøjagtige spørgsmål så fuldt ud (eller måske også) som nogle andre, men det er en moderne begrundelse for fortsat brug af de enkelte metoder. +1

Hvad er behovet for metoder som GET og POST i HTTP-protokollen?

Det lader til, at du glemte de gamle dage, hvor HTTP-servere var der bare for at tjene filer; ikke kører script, CGI eller laver dynamisk indhold af den slags.

Det anmodningsmetoder er grundlæggende standardiseret sæt af verb på hvad skal man gøre med disse filer...

  • GET betyder Hent
  • HEAD betyder få oplysninger om
  • PUT betyder upload
  • SLET betyder fjerne
  • POST betyder sende data til
  • OPTIONS betyder fortæl mig hvad jeg kunne gøre

På dagen for HTTP / 0.9 er anmodningslinjen det eneste i protokollens anmodningsdel ingen anmodningsoverskrifter, ingen svaroverskrifter. Du skriver bare ind GET /somefile, tryk på Gå ind, returnerer serveren svarteksten (dvs. HTML-indhold), og okay tak farvel (dvs. luk forbindelsen).

Hvis du bare mente at spørge hvorfor det blev designet på denne måde? Mit svar er, fordi det oprindeligt blev skrevet at håndtere den slags indholdsudveksling, der eksisterede dengang, dvs. servering af statiske HTML-filer på brugernes anmodning.

Men hvis du mente at spørge om, hvordan man behandler denne semantik i moderne applikationsserver...

Kan vi ikke implementere HTTP-protokollen ved kun at bruge et anmodningsorgan og et svarorgan?

Er det virkelig nødvendigt at implementere forskellige HTTP-metoder?

Mit svar er: gør hvad du vil, men husk at du burde ikke implementere applikationslogik på en måde, der trodser forventningerne til protokollen: forventninger som GET bør ikke ændre data (eller meget løst, i det mindste have et uhensigtsmæssigt resultat), HEAD skal have det samme resultat som GET, men uden svarorgan skal PUT gøre indholdet af mål-URI tilgængeligt (hvis det lykkes).

Hvis du går imod forventningerne uden nøje at overveje dens implikationerville forskellige ubehagelige ting ske, som ...

  • Når du skohorn GET-metoden til brug af dataindsendelse, kan serveren muligvis spytte 414 "URI for lang"fejl i dit ansigt.
  • Når du skohorn GET-metoden til brug af datamodifikation, vil du opdage, at ændring undertiden ikke kommer igennem, når brugeren er bag en cacheproxy, eller uventede ændringer ville finde sted, når brugeren huskede URL'en fra bogmærket (eller når webcrawlere når den) .
  • Når du reagerer forkert på HEAD-metoden, vil du finde ud af, at dine automatiske værktøjer til webstedskontrol (f.eks. wget --spider) kaution på dit websted.
  • Når du skohorn POST-metode til download af indhold, vil du opdage, at bogmærker eller endda indtastning af URL'en i browseren ikke fungerer.
  • Og mange flere...

'Begynder kender regler, men veteraner kender undtagelser.'

Under alle omstændigheder kan du ende med at finde nogle gyldige undskyldninger for at stride mod nogle af reglerne for nogle tilfælde med snæver brug; men sørg for at undersøge alle muligheder. Ellers ender du med at anspore interoperabilitet og ødelægge "brugeroplevelser".

Der er ingen garanti for, at brugerne altid bruger den nyeste skinnende udrulning af mainstream-navnebrandklienter / brugeragenter, som du testede. De bruger muligvis et lokalt mærke, der er skræddersyet til deres behov (mig inkluderet), en brugerdefineret, de bestilte fra specialbutikken ved siden af, eller en vintage, som de gravede ud af et lagerrum. Selv med alle disse forventes dine websteder stadig at give en rimelig service. Det er en grund til, at vi har standarder.

Uforsigtigt at bryde standarden betyder også, at du ansøger forskelsbehandling på dine brugere.

Det er sandt i teorien, at vi kunne bruge overalt, og det ville slags arbejde. Noget software bruger endda GET med anmodningsorgan (jeg kigger på dig elasticsearch / kibana). Dette er selvfølgelig en forfærdelig ting at gøre.

Den vigtigste årsag er, at de forskellige metoder har forskellig semantik. Nogle er sikre, andre er idempotente. Nogle er begge. Se hvilke er hvilke

Dette er vigtigt f.eks. når du interagerer med andre applikationer. GET-slutpunkter antages ikke at have bivirkninger. Dette er vigtigt, når google gennemsøger din side. PUT formodes at være ledig, hvilket betyder, at klienten er fri til at prøve igen i tilfælde af en fejl. Dette er ikke tilfældet for POST, hvorfor browsere skal have et grimt bekræftelsesfelt, hvis du trykker på f5 på en postanmodning.

Se hvad der kan ske, hvis du bruger GET, hvor du skulle have brugt POST

  • 1 FÅ med en krop er faktisk i overensstemmelse med specifikationen.
  • Interessant. Ser ud til at det blev ændret i 2014.
  • 1 FÅ med et legeme er ikke i overensstemmelse, det overtræder det ikke længere specifikt. Det er nu udefineret, hvorfor nogle kunder ikke understøtter det. Jeg tror, ​​at CURL er et eksempel

Du kan også tænke på GET, POST osv. Som overbelastning af den samme funktion eller endda som getters og setters.

GET_MyVar() tager ikke en inputparameter (også kaldet Request Body), men returnerer noget.

POST_MyVar(string blah) gør noget med input (igen anmodningsorganet) og kan returnere noget. (Det skal også i det mindste returnere en svarkode, så vi ved, at funktionen kørte !!)

DELETE_MyVar() Tager sandsynligvis heller ikke noget og forventes at slette noget.

Ja, vi kunne implementere det hele med:
MyVar(string Action, string? blah)

På denne måde kunne vi kun acceptere et opkald og derefter vælge, hvad vi skulle gøre baseret på en anden parameter.

Men en af ​​bekvemmelighederne ved denne tilgang er, at det giver browsere og servere mulighed for at optimere den måde, disse ting fungerer på. For eksempel vil serveren måske blokere alle anmodninger hvor Action==DELETE. Måske vil browsere cache ting hvor Action==GET. Hvis ikke, i hver funktion skulle vi skrive if (Action==Delete) {return AngryFace}

Der er ikke noget krav om at implementere alt nøjagtigt i henhold til protokol, men protokol er dybest set et sæt regler, som vi alle besluttede at følge. På den måde kan jeg let gætte, hvad dit websted vil gøre, selvom jeg ikke har set serveren!

HTTP-metoder tjener forskellige formål. Generelt, GET er til downloads og POST er til uploads.

Den eneste måde at implementere en del af HTTP-protokollen ved hjælp af kun en anmodningsinstans og en responsinstans ville være at implementere POST. GET har ikke et anmodningsorgan. Det har kun selve anmodningen med overskrifter, men ingen krop. Det er kun en anmodning om, at et dokument skal downloades. POST har både anmodningsorganet (filupload) og et svarorgan (dokumentet, der viser resultatet).

Så kunne du bare implementere POST og være færdig? Ikke hvis du vil have dit websted til brug i standardbrowsere. Standardanmodningstypen, som browsere sender, er GET. POST anmodninger sendes normalt kun, når der indsendes formularer på websider eller til AJAX-opkald. Kun hvis denne særlige server kun blev brugt til AJAX-opkald og ikke til sider, der er synlige for brugerne, kan du muligvis slippe af sted med POST kun.

Browsere sender også nogle gange HEAD anmoder om at kontrollere, om et dokument er ændret siden sidste gang de downloadede det, så det ville være tilrådeligt at i det mindste også implementere det.

Under alle omstændigheder er der ikke en god grund til at implementere en webserver til dit websted fra bunden. HTTP-protokollen er kompliceret. Ud over de forskellige metoder skal du også implementere pipelining og chunked anmodninger. Det er langt nemmere at opbygge din webapplikation oven på en webserver som Apache, Nginx eller IIS, der håndterer HTTP-protokollen for dig. Du nævner Servlets, så måske skal du bruge Tomcat eller JBoss webservere, der kører Servlets.

  • Jeg tror, ​​dette spørgsmål er på et større niveau end et websted. Ikke "Hvorfor skal jeg implementere GET og POST", men "hvorfor implementerer browsere GET og POST"?
  • @Mars Hvis det er tilfældet, er spørgsmålet ikke på emnet for dette websted.
  • Det er et historisk spørgsmål, formoder jeg, og det ser ud til, at det falder ind under problemer, der påvirker hele websteder (Fra siden Stil spørgsmål). Men OP forsvandt, så jeg antager, at det altid vil være et mysterium

Du har ret, vi kunne gøre netop det, GET, POST, PUT osv. Er bare historiske konventioner, hvis jeg havde min måde, HTTP ville blive erstattet af bare POST-metoden og intet andet, selvom jeg er nødt til at indrømme, at eliminering af GET ville være en enorm opgave, det kunne ikke gøres, hesten har allerede boltet på den ene

  • 1 "FÅ, POST, PUT osv. Er bare historiske konventioner" - De er ikke konventioner. De har præcist specificeret adfærd, og desuden har de præcist specificeret forskellige adfærd.
  • som web-API-udvikler kan jeg let udveksle GET'er med POST'er og omvendt, det er grundlaget for mit svar, hvis jeg skal være ærlig, har POST færre problemer at kæmpe med, og hvis jeg havde min vej id, lav alle mine API-metoder POST-metoder

Din foreslåede protokol ville være betydeligt mindre sikker mod hackere.

Der er en grund til, at websteder er flyttet væk fra at gemme oplysninger om variabler og lignende i URL'en, og den grund er enkel: det giver angribere en meget enkel måde at angribe dit system på. Ved at observere informationen om almindelig URL kan de bestemme, hvordan de data, der sendes til din webserver, er konstrueret; de kan derefter bruge disse oplysninger til at udføre et angreb på din server ved hjælp af en specielt konstrueret URL, der giver dem mulighed for at injicere ondsindet kode eller data på din server.

  • Bortset fra at under HTTPS er indholdet af GET overhovedet ikke i almindelig tekst på netværket ... Og angribere kan indsprøjte ondsindet kode ved rent held, brutal kraft eller anden teknik, de behøver ikke at se noget der allerede sker.

arbejdet for dig: Charles Robertson | Ønsker du at kontakte os?