Warum wird ein HTTP GET verwendet, um den Status auf dem Server in einem RESTful-Aufruf inkorrekt zu aktualisieren?

8

OK, ich kenne bereits alle Gründe auf Papier warum ich nicht ein HTTP GET verwenden sollte, wenn ich einen RESTful-Aufruf mache, um das zu aktualisieren Status von etwas auf dem Server. Dadurch werden möglicherweise unterschiedliche Daten jedes Mal zurückgegeben. Und ich weiß, das ist falsch für die folgenden "auf Papier" Gründen:

  • HTTP GET-Aufrufe sollten idempotent sein
  • N & gt; 0 Anrufe sollten immer die gleichen Daten zurückholen
  • verletzt HTTP-Spezifikation
  • HTTP-GET-Aufruf ist normalerweise schreibgeschützt

Und ich bin sicher, dass es mehr Gründe gibt. Aber ich brauche ein konkretes einfaches Beispiel zur Rechtfertigung außer "Nun, das verstößt gegen die HTTP-Spezifikation!". ... oder zumindest hoffe ich auf einen. Ich habe auch schon die folgenden gelesen, die eher der obigen Liste entsprechen: Verstößt es gegen den RESTful, wenn ich während eines GET-Aufrufs Dinge auf den Server schreibe? & amp; HTTP POST mit URL-Abfrageparametern - gute Idee oder nicht ?

Zum Beispiel kann jemand das obige rechtfertigen und warum es falsch / schlecht / falsch ist, ein HTTP GET mit dem folgenden RESTful Call zu verwenden

%Vor%

Ich weiß, dass es falsch ist, aber hoffentlich wird es helfen, ein Beispiel zu geben, um meine ursprüngliche Frage zu beantworten. Also würde das obige updateID = 5 mit AddToTotalAmount = 10 aktualisieren und dann die aktualisierten Datensätze zurückgeben. Ich kenne ein POST sollte verwendet werden, aber sagen wir, ich habe ein GET verwendet.

Wie genau und um meine Frage zu beantworten, oder kann dies ein tatsächliches Problem verursachen? Abgesehen von all den Verstößen gegen die obige Aufzählungsliste, wie kann die Verwendung eines HTTP GET zu dem oben genannten führen zu einem echten Problem? Zu oft komme ich zu einem Szenario, in dem ich Dinge rechtfertigen kann mit "Weil der Arzt das gesagt hat", aber ich brauche Rechtfertigung und ein besseres Verständnis für dieses Thema.

Danke!

    
atconway 09.05.2012, 15:19
quelle

4 Antworten

15

Der praktische Fall, in dem Sie ein Problem haben, ist, dass HTTP GET oft wiederholt wird, wenn die HTTP-Implementierung fehlschlägt. So können Sie im wirklichen Leben Situationen bekommen, in denen das gleiche GET mehrmals vom Server empfangen wird. Wenn Ihr Update idempotent ist (was Ihrs ist), dann wird es kein Problem geben, aber wenn es nicht idempotent ist (wie zB einen Wert zu einem Betrag hinzuzufügen), könnten Sie mehrere (unerwünschte) Updates erhalten.

HTTP POST wird nie wiederholt, so dass Sie dieses Problem nie haben würden.

    
Francis Upton 09.05.2012, 15:28
quelle
3

Wenn irgendeine Form von Suchmaschine Ihre Site spidern sollte, könnte dies Ihre Daten unbeabsichtigt verändern.

Dies passierte in der Vergangenheit mit der Desktopsuche von Google, die dazu führte, dass Personen Daten verloren haben, weil Personen Löschoperationen als GETs implementiert hatten.

    
Darrel Miller 09.05.2012 15:48
quelle
1

Hier ist ein wichtiger Grund, dass GETs idempotent sein sollten und nicht für die Aktualisierung des Status auf dem Server in Bezug auf Cross Site Request Forgery Attacks verwendet werden sollten. Aus dem Buch: Professional ASP.NET MVC 3

  

Idempotente GETs
  Großes Wort, sicher - aber es ist ein einfaches Konzept. Wenn ein   Operation ist idempotent, sie kann mehrfach ohne ausgeführt werden   Ändern des Ergebnisses. Im Allgemeinen ist eine gute Faustregel, dass Sie können   Verhindern Sie eine ganze Klasse von CSRF-Angriffen, indem Sie nur Dinge in Ihrem System ändern   DB oder auf Ihrer Website mit POST. Dies bedeutet Registrierung, Abmeldung,   Login und so weiter. Zumindest begrenzt dies die Verwirrung   Abgeordnete greift etwas an.

    
atconway 11.05.2012 19:42
quelle
-2

Ich denke, dass das Lesen dieser Ressource: Ссылка könnte für Sie hilfreich sein, um zwischen Nachrichten-API und Ressourcen-API zu unterscheiden?

    
Milan Svitlica 09.05.2012 15:33
quelle