3157 Stimmen

HTTP GET mit Anfragekörper

Ich entwickle gerade einen neuen RESTful Webservice für unsere Anwendung.

Bei einem GET auf bestimmte Entitäten können Clients den Inhalt der Entität anfordern. Wenn sie einige Parameter hinzufügen möchten (z. B. Sortieren einer Liste), können sie diese Parameter in den Abfrage-String einfügen.

Alternativ möchte ich, dass die Benutzer diese Parameter im Anfragetext angeben können. HTTP/1.1 scheint dies nicht ausdrücklich zu verbieten. Dadurch können sie mehr Informationen angeben, was die Angabe komplexer XML-Anfragen erleichtern könnte.

Meine Fragen:

  • Ist das überhaupt eine gute Idee?
  • Werden HTTP-Clients Probleme mit der Verwendung von Request Bodies innerhalb einer GET-Anfrage haben?

https://www.rfc-editor.org/rfc/rfc2616

620 Stimmen

Der Vorteil besteht darin, dass XML- oder JSON-Anfragekörper problemlos gesendet werden können, es gibt keine Längenbeschränkung und sie sind einfacher zu kodieren (UTF-8).

39 Stimmen

Wenn Sie eine sichere und idempotente Methode suchen, die Anfragekörper erlaubt, sollten Sie sich SEARCH, PROPFIND und REPORT ansehen. Wenn Sie GET nicht verwenden und einen Anfragebody haben, wird das Caching natürlich mehr oder weniger zunichte gemacht.

3 Stimmen

Unabhängig davon, ob die Spezifikation dies zulässt, verstößt es gegen den Geist von REST.

6voto

Frédéric Punkte 8771

Selbst wenn ein populäres Werkzeug dies verwendet, wie auf dieser Seite häufig zitiert wird, halte ich es für eine ziemlich schlechte Idee, da es zu exotisch ist, obwohl es in der Spezifikation nicht verboten ist.

Viele zwischengeschaltete Infrastrukturen lehnen solche Anträge einfach ab.

Vergessen Sie zum Beispiel, einige der verfügbaren CDN vor Ihrer Website zu verwenden, wie zum Beispiel diese eine :

Wenn ein Betrachter GET Anforderung einen Body enthält, gibt CloudFront einen HTTP-Statuscode 403 (Verboten) an den Betrachter zurück.

Und ja, es kann sein, dass Ihre Client-Bibliotheken das Senden solcher Anfragen auch nicht unterstützen, wie in dieser Kommentar .

5voto

GSerjo Punkte 4681

Ich bin verärgert, dass REST als Protokoll kein OOP unterstützt und Get Methode ist der Beweis. Als Lösung können Sie Ihr DTO in JSON serialisieren und dann einen Abfrage-String erstellen. Auf der Serverseite können Sie die Abfragezeichenfolge in das DTO deserialisieren.

Werfen Sie einen Blick auf:

Der nachrichtenbasierte Ansatz kann Ihnen helfen, die Beschränkungen der Get-Methode zu überwinden. Sie können beliebige DTOs mit dem Anforderungskörper senden

Das Nelibur Web Service Framework bietet Funktionen, die Sie nutzen können

var client = new JsonServiceClient(Settings.Default.ServiceAddress);
var request = new GetClientRequest
    {
        Id = new Guid("2217239b0e-b35b-4d32-95c7-5db43e2bd573")
    };
var response = client.Get<GetClientRequest, ClientResponse>(request);

as you can see, the GetClientRequest was encoded to the following query string

http://localhost/clients/GetWithResponse?type=GetClientRequest&data=%7B%22Id%22:%2217239b0e-b35b-4d32-95c7-5db43e2bd573%22%7D

5voto

chaz Punkte 479

Was ist mit nicht konformen base64-kodierten Kopfzeilen? "SOMETHINGAPP-PARAMS:sdfSD45fdg45/aS"

Längenbeschränkungen hm. Kannst du nicht dafür sorgen, dass deine POST-Behandlung zwischen den Bedeutungen unterscheidet? Wenn Sie einfache Parameter wie die Sortierung wollen, sehe ich nicht, warum das ein Problem sein sollte. Ich vermute, es ist die Sicherheit, über die Sie sich Sorgen machen.

4voto

EthraZa Punkte 368

IMHO könnten Sie einfach die JSON kodiert (d.h.. encodeURIComponent ) im URL so verstoßen Sie nicht gegen die HTTP Spezifikationen und erhalten Sie Ihre JSON zum Server.

4voto

Nick Punkte 8981

Es funktioniert zum Beispiel mit Curl, Apache und PHP.

PHP-Datei:

<?php
echo $_SERVER['REQUEST_METHOD'] . PHP_EOL;
echo file_get_contents('php://input') . PHP_EOL;

Konsolenbefehl:

$ curl -X GET -H "Content-Type: application/json" -d '{"the": "body"}' 'http://localhost/test/get.php'

Sortie :

GET
{"the": "body"}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X