このトピックを初めて読む読者は、あなたが何をすべきかについての無限の議論、そして経験からの教訓の相対的な欠如に衝撃を受けます。SOAPよりもRESTが「推奨」されているという事実は、経験からの高度な学習だと思いますが、そこから進歩したに違いないのでしょうか。それは2016年です。ロイの論文は2000年にありました。私たちは何を開発しましたか?楽しかったですか?統合は簡単でしたか?サポートするには?スマートフォンや不安定なモバイル接続の増加に対応しますか?
MEによれば、実際のネットワークは信頼できません。リクエストのタイムアウト。接続がリセットされます。ネットワークは一度に数時間または数日間ダウンします。電車は、モバイルユーザーを乗せてトンネルに入ります。特定の要求(この説明で時々認められるように)では、要求が途中で水に落ちたり、応答が途中で水に落ちたりすることがあります。これらの状況で、実質的なリソースに対して直接PUT、POST、およびDELETEリクエストを発行することは、常に私を少し残忍で素朴なものとして感じました。
HTTPは、要求と応答の確実な完了を保証するためには何も行いません。これは、ネットワーク対応アプリケーションの仕事であるため、問題ありません。このようなアプリケーションを開発する場合、フープをジャンプしてPOSTの代わりにPUTを使用し、重複するリクエストを検出した場合にサーバー上で特定の種類のエラーを発生させることができます。クライアントに戻って、これらのエラーを解釈し、再フェッチ、再検証、再投稿するために、フープをジャンプする必要があります。
または、これを行うことができます。安全でないリクエストを一時的なシングルユーザーリソースと見なします(アクションと呼びましょう)。クライアントは、リソースへの空のPOSTを使用して、実体リソースに対して新しい「アクション」を要求します。POSTはこれにのみ使用されます。新たに作成されたアクションのURIを安全に保持すると、クライアントはアクションURIに安全でない要求をPUTします。は、ターゲットリソースはなく、。アクションを解決して「実際の」リソースを更新することは、APIの仕事であり、信頼性の低いネットワークから切り離されています。
サーバーはビジネスを行い、応答を返し、合意されたアクションURIに対して格納します。何かがうまくいかない場合、クライアントはリクエストを繰り返し(自然な動作です!)、サーバーがすでにそれを確認している場合は、保存されているレスポンスを繰り返し、それ以外は何もしません。
あなたは約束との類似性をすぐに見つけるでしょう:私たちは何かをする前に結果のプレースホルダーを作成して返します。また、promiseのように、アクションは一度だけ成功または失敗する可能性がありますが、その結果は繰り返しフェッチできます。
何よりも、送信アプリケーションと受信アプリケーションに、一意に識別されたアクションをそれぞれの環境の一意性に関連付ける機会を与えます。そして、クライアントに責任ある行動を要求し、強制することができます!リクエストを好きなだけ繰り返しますが、既存のアクションから最終的な結果が得られるまで、新しいアクションを生成しないでください。
そのため、多くの厄介な問題が解消されます。挿入リクエストを繰り返しても重複は作成されず、データを取得するまで実際のリソースは作成されません。(データベースの列はnull可能ではありません)。繰り返される更新リクエストは、互換性のない状態にヒットすることはなく、その後の変更を上書きしません。クライアントは、何らかの理由(クライアントのクラッシュ、応答の欠落など)で元の確認を(再)フェッチしてシームレスに処理できます。
連続した削除リクエストは、404エラーに遭遇することなく、元の確認を表示および処理できます。予定よりも時間がかかる場合は、暫定的に対応でき、クライアントが最終的な結果を確認できる場所があります。このパターンの最も良い部分は、カンフー(パンダ)プロパティです。私たちは弱点を取り、クライアントが応答を理解できないときはいつでも要求を繰り返し、それを強みに変えます:-)
これがRESTfulではないと言う前に、RESTの原則が尊重される多くの方法を検討してください。クライアントはURLを作成しません。APIは、セマンティクスが少し変更されたとしても、検出可能なままです。HTTP動詞が適切に使用されている。これを実装するための大きな変更であると思われる場合は、経験からそうではないことがわかります。
保存するデータが大量にあると思われる場合は、話してみましょう。一般的な更新の確認は、キロバイトの端数です。HTTPは現在、1〜2分で確実に応答します。アクションを1週間しか保存しなくても、クライアントは追いつく十分な機会があります。ボリュームが非常に多い場合は、専用の酸に準拠したキーバリューストア、またはインメモリソリューションが必要になる場合があります。