Arten von HTTP-Anfragen und die REST-Philosophie

    Dieser Beitrag ist die Antwort auf die im Kommentar zu einem meiner Artikel gestellte Frage .

    In dem Artikel möchte ich Ihnen erklären, was HTTP-Methoden GET / POST / PUT / DELETE und andere sind, wofür sie erfunden wurden und wie sie gemäß REST verwendet werden.

    HTTP


    Was ist eines der wichtigsten Internetprotokolle? Ich werde die Pedanten an RFC2616 senden und den Rest menschlich mitteilen :)

    Dieses Protokoll beschreibt die Interaktion zwischen zwei Computern (Client und Server), die auf den Nachrichten Request und Response basiert. Jede Nachricht besteht aus drei Teilen: Startzeile, Kopfzeile und Text. In diesem Fall wird nur die Startzeile benötigt.

    Die Startlinie für die Anfrage und Antwort anderes Format - wir sind nur in der Anfangszeile der Abfrage interessieren, die wie folgt aussehen: , wo das Verfahren - das ist nur HTTP-Request - Methode, der URI - Resource Identifier, die VERSION - Protokoll Version (derzeit relevante Version 1.1) .

    METHOD URI HTTP/VERSION



    Überschriften sind eine Reihe von durch Doppelpunkte getrennten Name-Wert-Paaren. In den Headern werden verschiedene Dienstinformationen übertragen: Nachrichtencodierung, Browsername und -version, Adresse, von der der Client stammt (Referrer) usw.

    Der Hauptteil der Nachricht besteht in der Tat aus den übertragenen Daten. In der Antwort sind die übertragenen Daten in der Regel die vom Browser angeforderte HTML-Seite, und in der Anforderung werden beispielsweise die Inhalte der auf den Server hochgeladenen Dateien im Nachrichtentext übertragen. In der Regel fehlt jedoch der Hauptteil der Nachricht in der Anforderung.

    HTTP-Interaktionsbeispiel


    Betrachten Sie ein Beispiel.

    Anfrage:
    GET /index.php HTTP / 1.1
    Host: example.com
    User-Agent: Mozilla / 5.0 (X11; U; Linux i686; ru; rv: 1.9b5) Gecko / 2008050509 Firefox / 3.0b5
    Akzeptiere: text / html
    Verbindung: schließen
    

    Die erste Zeile ist die Abfragezeile, der Rest sind Überschriften; Nachrichtentext fehlt

    Antwort:
    HTTP / 1.0 200 OK
    Server: nginx / 0.6.31
    Inhaltssprache: en
    Inhaltstyp: Text / HTML; Zeichensatz = utf-8
    Inhaltslänge: 1234
    Verbindung: schließen
    ... SELBST SEITE ...
    

    Ressourcen und Methoden


    Wir kehren zur Startzeile der Abfrage zurück und erinnern uns, dass sie einen solchen Parameter wie einen URI enthält. Es steht für Uniform Resource Identifier - eine einheitliche Ressourcenkennung. Eine Ressource ist normalerweise eine Datei auf dem Server (ein Beispiel für einen URI in diesem Fall ist /styles.css), aber im Allgemeinen kann ein abstraktes Objekt auch eine Ressource sein ('/ blogs / webdev /' - gibt das "Web" an Entwicklung ”, keine bestimmte Datei).

    Der Typ der HTTP-Anforderung (auch als HTTP-Methode bezeichnet) gibt dem Server an, welche Aktion für die Ressource ausgeführt werden soll. Anfangs (Anfang der 90er Jahre) wurde davon ausgegangen, dass der Client nur eine Ressource haben möchte - um sie zu empfangen. Jetzt können Sie mithilfe des HTTP-Protokolls Posts erstellen, Ihr Profil bearbeiten, Nachrichten löschen und vieles mehr. Und diese Handlungen lassen sich mit dem Begriff „Quittung“ nur schwer verbinden.

    Um Aktionen mit Ressourcen auf der Ebene von HTTP-Methoden zu unterscheiden, wurden die folgenden Optionen erfunden:
    • GET - eine Ressource beschaffen
    • POST - Erstellt eine Ressource
    • PUT - Ressourcenaktualisierung
    • LÖSCHEN - Eine Ressource löschen

    Beachten Sie, dass die HTTP-Spezifikation den Server nicht zwingt, alle Methoden zu verstehen (von denen es tatsächlich viel mehr als 4 gibt) - nur GET ist erforderlich und teilt dem Server auch nicht mit, was er tun soll, wenn er eine Anforderung mit der einen oder anderen Methode empfängt. Dies bedeutet, dass der Server als Antwort auf die Anforderung DELETE /index.php HTTP / 1.1 nicht erforderlich ist, um die Seite index.php auf dem Server zu löschen, genauso wie die Anforderung GET /index.php HTTP / 1.1 nicht erforderlich ist, um die Seite index.php zurückzugeben. er kann es zB löschen :)

    REST betritt das Spiel


    REST (REpresentational State Transfer) - dieser Begriff wurde im Jahr 2000 von Roy Fielding - einem der Entwickler des HTTP-Protokolls - als Name der Gruppe von Prinzipien für die Erstellung von Webanwendungen eingeführt. Im Allgemeinen deckt REST einen größeren Bereich als HTTP ab - es kann auch in anderen Netzwerken mit anderen Protokollen verwendet werden. REST beschreibt die Prinzipien der Client-Server-Interaktion basierend auf den Konzepten „Ressource“ und „Verb“ (Sie können sie als Subjekt und Prädikat verstehen). Im Falle von HTTP wird eine Ressource durch ihren URI definiert, und ein Verb ist eine HTTP-Methode.

    REST schlägt vor, auf die Verwendung desselben URI für verschiedene Ressourcen zu verzichten (d. H. Die Adressen von zwei verschiedenen Artikeln wie /index.php?article_id=10 und /index.php?article_id=20 sind keine REST-Methoden) und unterschiedliche HTTP-Methoden für verschiedene zu verwenden Aktion. Das heißt, eine mit dem REST-Ansatz geschriebene Webanwendung löscht die Ressource, wenn Sie mit der HTTP-DELETE-Methode darauf zugreifen (dies bedeutet natürlich nicht, dass Sie die Möglichkeit geben müssen, alles und jeden zu löschen , aber jede Löschanforderung in der Anwendung sollte HTTP verwenden DELETE-Methode).

    Mit REST können Programmierer standardisierte und etwas schönere Webanwendungen als bisher schreiben. Unter Verwendung von REST lautet der URI zum Hinzufügen eines neuen Benutzers nicht /user.php?action=create (GET / POST-Methode), sondern einfach /user.php (ausschließlich POST-Methode).

    Infolgedessen sind verschiedene HTTP-Methoden sinnvoll, wenn die vorhandene HTTP-Spezifikation und der REST-Ansatz kombiniert werden. GET - gibt die Ressource zurück, POST - erstellt eine neue, PUT - aktualisiert die vorhandene, DELETE - löscht.

    Probleme?


    Ja, es gibt ein kleines Problem bei der Anwendung von REST in der Praxis. Dieses Problem heißt HTML.

    PUT / DELETE-Anforderungen können über XMLHttpRequest gesendet werden, indem „manuell“ auf den Server zugegriffen wird (z. B. per Curl oder sogar per Telnet). Sie können jedoch kein HTML-Formular erstellen, das eine vollständige PUT / DELETE-Anforderung sendet.

    Fakt ist die HTML-SpezifikationEs ist nicht möglich, Formulare zu erstellen, die Daten auf andere Weise als mit GET oder POST übermitteln. Für die normale Arbeit mit anderen Methoden müssen Sie sie daher künstlich simulieren. Beispielsweise können Sie in Rack (dem Mechanismus, mit dem Ruby mit einem Webserver interagiert; Rails, Merb und andere Ruby-Frameworks werden mit Rack erstellt) dem Formular ein ausgeblendetes Feld mit dem Namen "_method" hinzufügen und den Namen der Methode als Wert angeben (zum Beispiel „PUT“) - In diesem Fall wird eine POST-Anfrage gesendet, aber Rack kann so tun, als hätte es einen PUT erhalten, keinen POST.

    Jetzt auch beliebt: