9

OK、サーバー上の何かの状態を更新するためにRESTful呼び出しを行うときにHTTPGETを使用すべきではない理由を紙ですでにすべて知っています。したがって、毎回異なるデータを返す可能性があります。そして、私はこれが次の「紙の上の」理由で間違っていることを知っています:

  • HTTPGET呼び出しはべき等である必要があります
  • N> 0の呼び出しは、常に同じデータを取得する必要があります
  • HTTP仕様に違反している
  • HTTP GET呼び出しは、通常、読み取り専用です

そして、私はもっと多くの理由があると確信しています。しかし、「まあ、それはHTTP仕様に違反しています!」以外の正当化のための具体的な簡単な例が必要です。...または少なくとも私は1つを望んでいます。上記のリストに沿った次の内容もすでに読んでいます。GET呼び出しでサーバーに何かを書き込むと、RESTfulに違反しますか?URLクエリパラメータを使用したHTTP POST-良いアイデアかどうか?

たとえば、誰かが上記を正当化でき、次のRESTful呼び出しでHTTPGETを使用することが間違っている/悪い習慣/間違っている理由

"MyRESTService/GetCurrentRecords?UpdateRecordID=5&AddToTotalAmount=10"

私はそれが間違っていることを知っていますが、うまくいけば、それが私の元の質問に答える例を提供するのに役立つでしょう。したがって、上記では、recordID=5をAddToTotalAmount=10で更新してから、更新されたレコードを返します。POSTを使用する必要があることはわかっていますが、GETを使用したとしましょう。

私の質問にどの程度正確に答えることができますか、またはこれが実際の問題を引き起こす可能性がありますか?上記の箇条書きのすべての違反以外に、HTTP GETを使用して上記を実行すると、実際の問題が発生する可能性がありますか?「ドキュメントがそう言ったので」で物事を正当化できるシナリオに何度も遭遇しますが、これについては正当化とより良い理解が必要です。

ありがとう!

4

5 に答える 5

19

問題が発生する実際的なケースは、HTTP実装で障害が発生した場合に、HTTPGETが再試行されることが多いことです。したがって、実際には、同じGETがサーバーによって複数回受信される状況を取得できます。更新がべき等である場合(これはあなたのものです)、問題はありませんが、べき等でない場合(たとえば、金額に値を追加するなど)、複数の(望ましくない)更新を取得する可能性があります。

HTTP POSTが再試行されることはないため、この問題が発生することはありません。

于 2012-05-09T15:28:04.893 に答える
5

何らかの形式の検索エンジンがサイトをスパイダーすると、意図せずにデータが変更される可能性があります。

これは過去にGoogleのデスクトップ検索で発生し、ユーザーがGETとして削除操作を実装したためにデータが失われていました。

于 2012-05-09T15:48:02.600 に答える
1

クロスサイトリクエストフォージェリ攻撃に関して、GETがべき等であり、サーバーの状態を更新するために使用されるべきではないという重要な理由がここにあります。本から:Professional ASP.NET MVC 3

べき等は確かに大きな言葉を取得
します —しかしそれは単純な概念です。操作がべき等である場合、結果を変更せずに複数回実行できます。一般に、経験則として、POSTを使用して、DBまたはサイトの内容を変更するだけで、クラス全体のCSRF攻撃を防ぐことができます。これは、登録、ログアウト、ログインなどを意味します。少なくとも、これは混乱した副攻撃をいくらか制限します。

于 2012-05-11T19:42:07.450 に答える
0

もう1つの問題があります。GETメソッドを使用すると、データはURL自体で送信されます。Webサーバーのログでは、このデータはリクエストパスとともにサーバーのどこかに保存されます。ここで、誰かがこれらのログファイルにアクセスしたり、それらのログファイルを読み取ったりすると、データ(ユーザーID、パスワード、キーワード、トークンなど)が明らかになるとします。これは危険であり、注意が必要です。

サーバーのログファイルでは、ヘッダーと本文はログに記録されませんが、リクエストパスはログに記録されます。したがって、データがリクエストパスではなく本文で送信されるPOSTメソッドでは、データは安全に保たれます。

于 2020-07-25T13:55:00.530 に答える
-2

このリソースを読むと、 http ://www.servicedesignpatterns.com/WebServiceAPIStylesがメッセージAPIとリソースAPIを区別するのに役立つと思いますか?

于 2012-05-09T15:33:22.373 に答える