50

RESTful API は HTTP PATCH を介して個別に部分的な更新をサポートする必要があると誰が言いますか?

ご利益はないようです。サーバー側で実装する作業が増え、クライアント側で要求する更新の種類を決定するためのロジックが増えます。

私は、既知のデータ モデルに抽象化を提供する HTTP を使用して REST API を作成するコンテキスト内でこの質問をしています。完全または部分的な更新に PUT を要求するのではなく、部分的な更新に PATCH を要求することには何のメリットもないように感じますが、私には納得できます。

関連している

http://restcookbook.com/HTTP%20Methods/idempotency/ - これは、リクエストをキャッシュするサーバー ソフトウェアを制御できないことを意味します。

部分的な PUT を許可しない理由は何ですか? - 明確な回答はありません。PUt と PATCH について HTTP が定義するものへの参照のみです。

http://groups.yahoo.com/neo/groups/rest-discuss/conversations/topics/17415 - これに関する意見の相違を示しています。

4

3 に答える 3

76

誰が言う?REST を発明した人物は次のように述べています。

@mnot Oy、はい、部分的な PUT は決して RESTful ではないため、PATCH は最初の HTTP/1.1 提案のために作成したものでした。;-)

https://twitter.com/fielding/status/275471320685367296

まず第一に、REST はアーキテクチャ スタイルであり、その原則の 1 つは、その基礎となるプロトコルの標準化された動作を活用することです。そのため、HTTP を介して RESTful API を実装する場合は、HTTP に厳密に従う必要があります。 RESTful。それがあなたのニーズに合わないと思うなら、あなたは自由にそうしないことができます.誰もそれについてあなたを呪うことはありません.しかし、あなたはRESTを行っていません. クライアントとサーバーの実装の間に強い結合を作成し、どこでどのように標準から逸脱しているかを文書化する必要があります。REST を使用することの全体的なポイントは、まさにそれを回避し、メディアの種類に焦点を当てることです。

したがって、RFC 7231 に基づいて、PUT はべき等操作で表現を完全に置き換える場合にのみ使用する必要があります。PATCH は、冪等である必要のない部分的な更新に使用する必要がありますが、前提条件を要求するか、差分を適用する前に現在の状態を検証することにより、冪等にすることをお勧めします。べき等でない更新を行う必要がある場合は、部分的であろうとなかろうと、POST を使用します。単純。PUT と PATCH がどのように機能するかを知っている API を使用するすべての人は、それらがそのように機能することを期待しており、特定のリソースに対してメソッドが何をすべきかを文書化または説明する必要はありません。適切と思われる他の方法で PUT を自由に動作させることができますが、その場合、クライアントのためにそれを文書化する必要があり、API の別のバズワードを見つける必要があります。これは RESTful ではないためです。

REST は、API の長期的な進化に焦点を当てたアーキテクチャ スタイルであることに注意してください。正しく行うと、今はさらに多くの作業が追加されますが、後で変更が容易になり、トラウマが少なくなります。これは、REST がすべての人にとって適切であるという意味ではありません。実装の容易さと短期間の使用に焦点を当てている場合は、必要に応じてメソッドを使用してください。クライアントが正しい方法を選択することを気にしたくない場合は、POST を介してすべてを行うことができます。

于 2013-11-01T22:42:32.043 に答える
16

既存の answerを拡張するにPUTは、HTTP がこの方法でメソッドを定義するという理由だけで、リソース状態の完全な更新 (上書き) を実行することになっています。HTTP/1.1 に関する元の RFC 2616はこれについてあまり明示的ではありません。RFC 7231はセマンティックの説明を追加します。

4.3.4 置く

PUT メソッドは、ターゲット リソースの状態を作成するか、要求メッセージ ペイロードに含まれる表現によって定義された状態に置き換えることを要求します。特定の表現の PUT が成功すると、同じターゲット リソースに対する後続の GET によって、同等の表現が 200 (OK) 応答で送信されることが示唆されます。

他の回答で述べたように、この規則に従うことで API の理解と使用が簡素化され、PUT メソッドの動作を明示的に文書化する必要がなくなります。


ただし、冪等性のため、部分的な更新は許可されません。これらの概念は、多くの StackOverflow の回答でも混同されることが多いため、これを強調することが重要であると思います (例:ここ)。

べき等とは、リクエストを 1 回または複数回適用すると、サーバーに同じ効果が生じることのみを意味します。RFC 7231 をもう一度引用するには:

4.2.2 冪等メソッド

要求メソッドは、そのメソッドを使用した複数の同一の要求のサーバーに対する意図された効果が、単一のそのような要求の効果と同じである場合、「冪等」と見なされます。

部分的な更新にリソース状態の新しい値のみが含まれ、以前の値に依存しない (つまり、それらの値が上書きされる) 限り、冪等性の要件は満たされます。このような部分的な更新が適用される回数に関係なく、サーバーの状態は常に要求で指定された値を保持します。

別のクライアントからの中間要求がリソースの別の部分を変更できるかどうかは関係ありません。冪等性は状態自体ではなく操作(つまりメソッド) を参照するためです。PUTまた、部分上書き更新の運用については、1回でも複数回でも同じ効果が得られます。

逆に、べき等でない操作は、現在のサーバーの状態に依存するため、実行回数によって結果が異なります。これの最も簡単な例は、数値をインクリメントする (非冪等) 対絶対値に設定する (冪等) です。

冪等でない変更の場合、HTTP はメソッドPOSTおよび をPATCH予見しますPATCHが、既存のリソースに変更を加えるように明示的に設計されていますPOSTが、リクエスト URI、本文の内容、およびサーバーへの副作用の関係に関しては、はるかに自由に解釈できます。


これは実際にはどういう意味ですか?REST は、HTTP プロトコルを介して API を実装するためのパラダイムです。これは、多くの人が妥当と考えている規則であり、採用または理解される可能性が高いものです。それでも、何が RESTful で何がそうでないかについては論争がありますが、それらを脇に置いても、REST は HTTP API を構築するための唯一の正しいまたは意味のある方法ではありません。

HTTP プロトコル自体によって、実行できることと実行できないことが制限されており、その多くは実際に実際に影響を及ぼします。たとえば、冪等性を無視すると、クライアントによって実際に発行されたリクエストの数がキャッシュ サーバーによって変更され、その後、アプリケーションが期待するロジックが混乱する可能性があります。したがって、標準から逸脱した場合の影響を認識することが重要です。

厳密に REST に準拠しているため、部分的な更新に対して完全に満足のいく解決策はありません (この必要性だけでは REST に反するとさえ言う人もいます)。問題はPATCH、最初はこの目的のためだけに作成されたように見える がべき等ではないことです。したがって、べき等部分更新を使用PATCHすると、べき等性の利点(任意の回数の自動再試行、単純なロジック、クライアント、サーバー、およびネットワークでの最適化の可能性) が失われます。PUTそのため、動作が明確に文書化されていて、ユーザー (および中間ネットワーク ノード) が特定の動作に依存しているために壊れない限り、使用が本当に最悪のアイデアであるかどうかを自問することができます...?

于 2016-12-19T22:33:39.480 に答える