2016-09-01 5 views
2

Ich denke über das Erstellen einer REST-API für einen vorhandenen reinen HTTP-basierten Webdienst nach.RESTful-Webdienst, POST für Datenabruf

Bis jetzt können Clients HTTP POST-Anforderungen zum Abrufen von Daten an den Dienst senden. Die HTTP-Körper dieser Anforderungen enthalten so etwas wie Abfrageparameter. Es ist ein XML-Dialekt. Diese Abfragen können oft eine Größe von mehr als 30 kB haben.

Auch für Abfragen ist eine Verschlüsselung erforderlich. Daher können die Abfrageparameter von HTTP GET nicht als Abfragezeichenfolge übertragen werden.

Meine Frage ist: verletzt es das REST-Prinzip "POST ändert Server-Status", wenn ich HTTP POST zum Abrufen von Daten verwenden?

Nach jeder Abrufaktion (erfolgreich oder nicht) wird der Protokolltabelle in einer Datenbank ein Protokolleintrag hinzugefügt.


aktualisieren

So können die Abfrageparameter nicht von HTTP GET als Query-String

Wie ich aus den Kommentaren gelernt haben, übertragen werden und die Antwort, die Abfragezeichenfolge ist verschlüsselt. Es wird jedoch nicht empfohlen, sicherheitsrelevante Daten innerhalb der Abfragezeichenfolge zu übertragen.

+1

Ja, POST dient zum Erstellen von Daten. Wenn Sie SSL verwenden, müssen Sie sich auch keine Sorgen über die Verschlüsselung von Parametern machen. – sed

+1

@Stan - Sicher, HTTPS verwendet Verschlüsselung. Aber die URL - einschließlich der Abfragezeichenfolge - wird niemals verschlüsselt. Dies ist einer der beiden Gründe, warum die Clients die Anfrage an den HTTP-Body senden müssen. – JimHawkins

+1

Nein, es ist ebenfalls verschlüsselt.Es ist keine gute Idee, sensible Informationen über Querystring zu übergeben, ** aber es ist sicher gegen Traffic-Sniffing **. – sed

Antwort

3

Während es technisch verletzt REST, wenn Ihre Abfrage Parameter sind groß, die es klingt wie sie sind, dann kann POST der einzige Weg zu gehen. Außerdem unterstützen nicht alle Clients GET mit Körperparametern.

Elasticsearch ermöglicht auch Anfragen POST:

Sowohl HTTP GET und HTTP POST verwendet werden kann, suchen mit Körper auszuführen. Da nicht alle Clients GET mit body unterstützen, ist auch POST erlaubt. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html

Wie funktioniert Azure Search API
https://msdn.microsoft.com/en-gb/library/azure/dn798927.aspx

Der Punkt, den ich machen würde versuchen, ist, dass, während es gegen REST Prinzipien geht, manchmal Regeln sind dazu da, gebrochen werden.
könnten Sie denken immer, es als POSTen (Erstellen) eine Abfrage ;-)

Als Randnotiz re: GET-Anfragen/Abfrage-Strings

Der gesamte Text einer HTTPS-Sitzung gesichert ist/verschlüsselt SSL.
Dies umfasst die Abfrage und die Header.
In dieser Hinsicht wäre ein POST und ein GET genau gleich.

+0

Ein kleiner Zusatz: die Semantik von 'GET 'geändert zwischen [RFC2616] (https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3) und [RFC7231] (https://yada.juxt.pro/spec/rfc7231#) Abschnitt 4.3.1) leicht. Während der erstgenannte nicht wirklich verbot, Payload mit einer GET-Anfrage zu senden, nahmen viele Implementierungen an, dass es dies ist und ignorierten es daher oder reagierten mit einem Fehler, wenn eine Payload verfügbar war. Die neue Spezifikation besagt jedoch eindeutig, dass die Semantik der Nutzdaten in einer GET-Anforderung nicht definiert ist und ältere Server möglicherweise nicht mehr unterstützt. [Siehe auch] (http://stackoverflow.com/a/35794273/1377895) –

Verwandte Themen