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