Si noti che la domanda è stata modificata / chiarita da quando questa risposta è stata scritta per la prima volta. Un'ulteriore risposta all'ultima iterazione della domanda è dopo la seconda regola orizzontale
Qual è la necessità di metodi come GET e POST nel protocollo HTTP?
Insieme ad alcune altre cose come i formati di intestazione, le regole per la separazione di intestazioni e corpi, formano la base del protocollo HTTP
Non possiamo implementare il protocollo HTTP usando solo un corpo di richiesta e un corpo di risposta?
No, perché qualsiasi cosa tu abbia creato non sarebbe il protocollo HTTP
Ad esempio, l'URL conterrà la richiesta, che verrà mappata su una funzione in base al linguaggio di programmazione sul lato server, ad esempio un Servlet e in risposta, la risposta HTML e JavaScript verrà inviata attraverso.
Congratulazioni, hai appena inventato un nuovo protocollo! Ora, se si desidera creare un organismo standard per guidarlo e mantenerlo, svilupparlo, ecc., Potrebbe un giorno superare l'HTTP
Apprezzo che questo sia un po 'ironico, ma non c'è nulla di magico in Internet, TCP / IP o nelle comunicazioni tra server e client. Si apre una connessione e si inviano alcune parole lungo il filo, formando una conversazione. La conversazione deve davvero aderire ad alcune specifiche ratificate ad entrambe le estremità se le richieste devono essere comprese e le risposte sensate consegnate. Questo non è diverso da qualsiasi dialogo nel mondo. Parli inglese, il tuo vicino parla cinese. Spero che agitare la mano, indicare e scuotere il pugno sia sufficiente a trasmettere il tuo messaggio che non vuoi che parcheggi la sua auto davanti a casa tua.
Di nuovo su Internet, se si apre un socket su un server Web conforme a HTTP e si invia quanto segue:
EHLO
AUTH LOGIN
(L'inizio di una trasmissione e-mail SMTP) non otterrai una risposta ragionevole. Potresti creare il client conforme SMTP più perfetto, ma il tuo server web non ci parlerà perché questa conversazione riguarda tutto il protocollo condiviso - nessun protocollo condiviso, nessuna gioia.
Questo è il motivo per cui non è possibile implementare il protocollo HTTP senza implementare il protocollo HTTP; se ciò che scrivi non è conforme al protocollo, semplicemente non è il protocollo - è qualcos'altro e non funzionerà come specificato nel protocollo
Se corriamo con il tuo esempio per un momento; dove il client si connette e indica semplicemente qualcosa che assomiglia a un URL .. E il server lo capisce e invia semplicemente qualcosa che assomiglia a HTML / JS (una pagina Web), quindi potrebbe funzionare. Cosa hai salvato però? Un paio di byte per non dire GET? Qualche altro in più per abbandonare quelle fastidiose intestazioni ... Anche il server ne ha salvate alcune, ma cosa succede se non riesci a capire cosa ti ha inviato? E se chiedessi un URL che termina in JPEG e ti ha inviato alcuni byte che creano un'immagine, ma è in formato PNG? Un PNG incompleto. Se solo avessimo un'intestazione che dicesse quanti byte stava andandoper inviare, quindi sapremmo se il numero di byte che abbiamo ricevuto era effettivamente l'intero file o no. Che cosa succede se il server gzipizza la risposta per risparmiare un po 'di larghezza di banda ma non te lo dice? Trascorrerai una notevole potenza di calcolo cercando di capire cosa ti ha inviato.
Alla fine della giornata, abbiamo bisogno di metainformation - informazioni sulle informazioni; abbiamo bisogno di intestazioni; abbiamo bisogno di file per avere nomi, estensioni, date di creazione. Abbiamo bisogno che le persone abbiano compleanni, per favore, grazie, ecc. - il mondo è pieno di protocolli e informazioni sul contesto, quindi non dobbiamo sederci e lavorare tutto da zero tutto il tempo. Costa un po 'di spazio di archiviazione, ma ne vale la pena
L'implementazione di vari metodi HTTP è davvero necessaria?
Probabilmente, non è necessario implementare l'intero protocollo specificato, e questo di solito è vero per qualsiasi cosa. Non conosco ogni parola in inglese; il mio vicino cinese è anche uno sviluppatore di software ma in un settore diverso e non conosce nemmeno il cinese per alcuni dei termini usati nel mio settore e tanto meno l'inglese. La cosa buona è, però, che entrambi possiamo prendere un documento sull'implementazione di HTTP, lui può scrivere il server e io posso scrivere il client, in diversi linguaggi di programmazione su architetture diverse, e funzionano ancora perché aderiscono al protocollo
Può darsi che nessuno dei tuoi utenti emetterà mai qualcosa di diverso da una richiesta GET, non userà connessioni persistenti, invierà qualcosa di diverso da JSON come corpo o dovrà accettare qualsiasi cosa diversa da text / plain in modo da poter scrivere un web server veramente ridotto che soddisfi solo le esigenze molto limitate del browser client. Ma non potevi semplicemente decidere arbitrariamente di eliminare le regole di base che rendono "un po 'di testo che passa giù un socket" che cos'è HTTP; non puoi abbandonare l'idea di base che la richiesta sarà una stringa come:
VERB URL VERSION
header: value
maybe_body
E la risposta avrà una versione, un codice di stato e forse delle intestazioni. Se cambi qualcosa di tutto ciò - non è più HTTP - è qualcos'altro e funzionerà solo con qualcosa progettato per capirlo. HTTP è quello che è con queste definizioni, quindi se si desidera implementarlo, è necessario seguire le definizioni
Aggiornare
La tua domanda si è leggermente evoluta, ecco qualche risposta a ciò che chiedi:
Perché il protocollo HTTP ha nozione di metodi?
Storicamente è necessario apprezzare che le cose erano molto più rigide nella loro progettazione e implementazione, anche nella misura in cui gli script non esistevano e persino l'idea che le pagine potessero essere dinamiche, generate al volo in memoria e spinte verso il basso invece di essere un file statico su disco richiesto dal client, letto e inserito nel socket, non esisteva. Poiché il Web molto precoce era incentrato sulla nozione di pagine statiche che contenevano collegamenti ad altre pagine, tutte le pagine esistevano sul disco e la navigazione sarebbe stata dal terminale principalmente effettuando richieste GET per le pagine agli URL, il server sarebbe in grado di mappare l'URL a un file su disco e inviarlo. C'era anche l'idea che la rete di documenti che si collegavano tra di loro e altrove dovrebbe essere una evoluzione,
Ciò fornisce un contesto storico per i metodi: una volta l'URL era il bit inflessibile e si riferiva semplicisticamente alle pagine sul disco, quindi il metodo era utile perché permetteva al client di descrivere quale intenzione aveva per il file e il server avrebbe elaborare il metodo in modo diverso. Non c'era davvero l'idea che gli URL fossero virtuali o usati per cambiare o mappare nella visione originale di un ipertesto (ed era davvero solo testo) web
Non intendo che questa risposta sia una documentazione del record storico con date e riferimenti citati esattamente quando le cose hanno iniziato a cambiare - per questo probabilmente puoi leggere Wikipedia - ma è sufficiente dire che nel tempo il desiderio di il Web sarà più raccolto e ad ogni estremità della connessione server-client le opportunità per creare una ricca esperienza multimediale che stiamo espandendo. I browser supportano un'enorme proliferazione di tag per la formattazione dei contenuti, ognuno dei quali corre per implementare le funzionalità di ricchezza multimediale indispensabili e nuovi modi per rendere le cose eleganti.
Lo scripting è arrivato sul lato client e i plug-in e le estensioni del browser, tutti volti a trasformare il browser in un potente motore di tutto. Alla fine del server, la generazione attiva di contenuti basati su algoritmi o dati di database è stata la grande spinta e continua a svilupparsi nella misura in cui probabilmente ci sono più pochi file sul disco - certo, manteniamo un'immagine o un file di script come file su il web server e il browser lo ottengono, ma sempre più le immagini che il browser mostra e gli script che esegue non sono file che è possibile aprire in Esplora file, sono contenuti generati che sono l'output di alcuni processi di compilazione eseguiti su richiesta , SVG che descrive come disegnare pixel anziché una matrice bitmap di pixel o JavaScript che è stato emesso da una forma di livello superiore di script come TypeScript
Nel rendere moderne pagine multi-megabyte, probabilmente solo una parte di esso è ora contenuto fisso su un disco; i dati del database sono formattati e modellati in html che il browser consumerà ed è fatto dal server in risposta a più diverse routine di programmazione a cui fa riferimento in qualche modo l'URL
Ho detto nei commenti alla domanda che è un po 'come il cerchio completo. Ai tempi in cui i computer costavano centinaia di migliaia e riempivano le stanze era comune consentire a più utenti di utilizzare l'unico super potente mainframe centrale tramite centinaia di terminali stupidi: una tastiera e un mouse, uno schermo verde, inviare del testo, ottenere alcuni sms. Con il passare del tempo, con l'aumento della potenza di calcolo e il calo dei prezzi, le persone hanno iniziato a finire con computer desktop più potenti dei primi mainframe e la possibilità di eseguire localmente potenti app in modo da rendere obsoleto il modello di mainframe. Non è mai andato via, perché le cose si sono evolute per spostarsi dall'altra parte e in qualche modo tornare a un server centrale che fornisce la maggior parte delle funzionalità delle app utili e un centinaio di computer client che fanno ben poco tranne che disegnare sullo schermo, e inviare e ricevere dati da / verso il server. Quel periodo intermedio in cui il tuo computer è stato abbastanza intelligente da eseguire la sua stessa copia di Word e Outlook allo stesso tempo ha di nuovo lasciato il posto a Office online, in cui il tuo browser è un dispositivo per disegnare immagini sullo schermo e modificare il documento / e-mail ' sto scrivendo come una cosa che vive sul server, viene salvata lì, inviata e condivisa con altri utenti tutto come l'idea che il browser sia solo una shell che fornisce una visione parziale in qualsiasi momento di questa cosa che vive altrove
Dalle risposte, ho un'idea del perché esiste il concetto di metodi ... Questo porta a un'altra domanda correlata:
Ad esempio, nel link di composizione di Gmail, verranno inviati la richiesta PUT / POST e i dati. In che modo il browser viene a sapere quale metodo utilizzare?
Utilizza GET per impostazione predefinita, per convenzione / specifica poiché è ciò che viene decretato quando si digita un URL e si preme Invio
La pagina gmail inviata dal server include il nome del metodo da utilizzare quando si chiama la richiesta di composizione di gmail?
Questa è una delle cose chiave a cui alludo nei commenti sopra. Nel web moderno non si tratta più nemmeno di pagine. Una volta che le pagine erano file su disco, il browser avrebbe ottenuto. Quindi sono diventate pagine che sono state principalmente generate dinamicamente inserendo i dati in un modello. Ma comportava ancora un processo "richiedi una nuova pagina dal server, ottieni una pagina, mostra la pagina". Lo scambio di pagine è diventato davvero fluido; non li hai visti caricare, ridimensionare e scuotere il loro layout in modo da renderlo più fluido ma era ancora il browser che sostituiva un'intera pagina o parte di una pagina con un'altra
Il modo moderno di fare le cose è con un'applicazione a pagina singola; il browser ha un documento in memoria che viene visualizzato in un certo modo, lo scripting chiama a thebservr e recupera un po 'di informazioni, e manipola il documento in modo che parte della pagina cambi visivamente per mostrare le nuove informazioni - tutto il resto funziona senza il browser carica sempre un'altra nuova pagina; è appena diventata un'interfaccia utente in cui parti di essa si aggiornano proprio come un'app client tipica come word o Outlook. Nuovi elementi vengono visualizzati sopra altri elementi e possono essere trascinati attorno alla simulazione di finestre di dialogo, ecc. Tutto questo È il motore di scripting del browser che invia richieste utilizzando il metodo http desiderato dallo sviluppatore, recuperando i dati e cercando il documento che il browser sta disegnando. Puoi immaginare che il browser moderno sia un dispositivo brillante che assomiglia a un intero sistema operativo o computer virtuale; un dispositivo programmabile che ha un modo abbastanza standardizzato di disegnare cose sullo schermo, riprodurre suoni, catturare l'input dell'utente e inviarlo per l'elaborazione. Tutto quello che devi fare per farlo disegnare la tua interfaccia utente è fornirgli un po 'di html / css che crea un'interfaccia utente, quindi modificare costantemente l'html per fare in modo che il browser cambi ciò che sta disegnando. Diamine, le persone sono così abituate a vedere la barra degli indirizzi cambiare / usarla come una direzione di intenti che una singola pagina app cambierà l'url a livello di codice anche se non viene eseguita alcuna navigazione (che richiede pagine completamente nuove) Tutto quello che devi fare per farlo disegnare la tua interfaccia utente è fornirgli un po 'di html / css che crea un'interfaccia utente, quindi modificare costantemente l'html per fare in modo che il browser cambi ciò che sta disegnando. Diamine, le persone sono così abituate a vedere la barra degli indirizzi cambiare / usarla come una direzione di intenti che una singola pagina app cambierà l'url a livello di codice anche se non viene eseguita alcuna navigazione (che richiede pagine completamente nuove) Tutto quello che devi fare per farlo disegnare la tua interfaccia utente è fornirgli un po 'di html / css che crea un'interfaccia utente, quindi modificare costantemente l'html per fare in modo che il browser cambi ciò che sta disegnando. Diamine, le persone sono così abituate a vedere la barra degli indirizzi cambiare / usarla come una direzione di intenti che una singola pagina app cambierà l'url a livello di codice anche se non viene eseguita alcuna navigazione (che richiede pagine completamente nuove)
quando chiamiamo www.gmail.com, deve utilizzare il metodo GET, come fa il browser a sapere che questo metodo deve essere utilizzato?
Vero. Perché è specificato. La prima richiesta è come è sempre stata- OTTENERE un codice HTML iniziale per disegnare un'interfaccia utente, quindi cercare o manipolarla per sempre o ottenere un'altra pagina con altri script che colpisca e manipoli e crei un'interfaccia utente reattiva reattiva
Come dicono alcune risposte, possiamo creare nuovi utenti sul metodo DELETE, quindi questo solleva la domanda dietro l'idea dei metodi nel protocollo http, perché alla fine, dipende totalmente dai server su quale funzione vogliono mappare un URL . Perché il client dovrebbe dire ai server quali metodi usare per un URL.
Storia. Legacy. Potremmo teoricamente lanciare tutti i metodi http domani - siamo a un livello di sofisticazione della programmazione in cui i metodi sono obsoleti perché gli URL sono processabili nella misura in cui possono essere il meccanismo di commutazione che indica al server in cui si desidera salvare i dati il corpo come bozza di e-mail o elimina una bozza - non esiste un file / e-mail / bozza / salvataggio / 1234 sul server - il server è programmato per separare quell'URL e sapere cosa fare con i dati del corpo - salva come bozza di posta elettronica con ID 1234
Quindi è certamente possibile eliminare i metodi, tranne l'enorme peso della compatibilità ereditaria che è cresciuta intorno a loro. È meglio usarli solo per ciò che è necessario, ma ignorarli in gran parte e invece utilizzare tutto ciò di cui hai bisogno per far funzionare le tue cose. Abbiamo ancora bisogno di metodi così specifici perché devi ricordare che significano qualcosa per il browser e il server su cui abbiamo creato le nostre app. Lo script lato client vuole usare il browser sottostante per inviare dati, deve usare un metodo che farà fare al browser come richiesto, probabilmente un POST perché GET racchiude tutte le sue informazioni variabili nell'URL e che ha un limite di lunghezza in molti server. Il client vuole una lunga risposta dal server - non usare un HEAD perché non dovrebbero assolutamente avere corpi di risposta.