7

アイスクリーム店をモデル化する RESTful なハイパーテキスト駆動型サービスがあるとします。店舗の管理を改善するために、販売された各種類のアイスクリームの数量と金額をリストする日次レポートを表示できるようにしたいと考えています。

このレポート機能は、DailyReport というリソースとして公開できるようです。DailyReport はすぐに生成でき、実際にサーバーにレポートを保存する利点はないようです。DailyReport が必要な日もあれば、DailyReport を取得する必要がない日もあります。さらに、DailyReports をサーバーに保存すると、クライアントの実装が複雑になり、不要になったレポートを忘れずに削除する必要があります。

DailyReport は一時的なものです。その表現は一度だけ取得できます。これを実装する 1 つの方法は、リンク "/daily-reports" を提供することです。これは、その日の売上に関する情報をリストする DailyReport 表現を含む応答を返す POST です。

編集:私は本当に POST リクエストをしたいとも言いましょう。DailyReport には、アイスクリームの種類をアルファベット順、ドルの値で並べ替えたり、1 時間ごとの内訳を含めたり、オプションでその日の気温を含めたり、特定のアイスクリームの種類を (リストとして) 除外したりするなど、ビューを作成するためのさまざまなオプションがあります。GET でクエリ パラメーターを使用するのではなく、適切なオプションを使用して DailyReport 表現を POST したいと思います (各オプションを文書化するために明確に定義されたカスタム メディア タイプを使用します)。返される表現には、レポート自体とともにオプションが表示されます。

これは問題について考える正しい方法ですか、それとも代わりに他のアプローチを使用する必要がありますか? 正しい場合、DailyReport リソースを実装する際に特に考慮すべき点は何ですか? (たとえば、POST 要求の後に戻るときに Location ヘッダーを設定するのはおそらく適切ではありません)。

4

4 に答える 4

4

過去の日次レポートを利用できるようにする場合は、GETtoとして実装できます/daily_reports/2009/08/20。ここではPOSTは不要であるというジョン・ミリキンに同意します。このようなものがユーザーが作成できるリソースである必要はありません。

独自のURIとして毎日のレポートを利用できるようにすることの利点は、キャッシュ可能性です。

編集:良い解決策は、2つの答えをマージして、daily_report/当日のデータのdaily_reports/yyyy/mm/ddキャッシュなしの表現と1日のデータのキャッシュ可能な表現を作成することです。

于 2009-08-20T22:10:37.860 に答える
2

レポートを要求してもサーバーの状態は変更されないため、これにPOSTを使用する必要はありません。私はこのようなリソースを使用します:

GET /daily-report/

200 OK
Pragma: no-cache
<daily-report for="2009-04-20" generated-at="2009-4-20T12:13:14Z">
    <!-- contents of the report here -->
</daily-report>

編集への応答:レポートの説明をURLにPOSTし、その結果として一時データセットを取得する場合、それはRESTではありません。これは、SOAPと同じようにRPCです。RPCは本質的に悪いことではありませんが、RESTfulとは呼ばないでください。

于 2009-08-20T22:08:44.400 に答える
2

レポートのリクエストを記録しておくことが望ましい場合もあります。そのような場合は、コレクションリソースにPOSTするのは不合理ではありません。また、実行を非同期で処理する長時間実行レポートにも役立ちます。サーバーがこれらのレポート要求を保持する期間は、ユーザー次第です。

私は次のようなことをします

POST /DailyReportRequests

これは、オプションを含むリクエストの表現を返し、レポートが完了すると、レポート結果へのリンクを返します。

事前に用意されたレポートのセットがある場合に適したもう1つの方法は、事前に構成されたレポートリンクのリストを含むDailyReportsリソースを作成することです。OpenSearchDescription仕様では、Queryタグを使用してこれと同様のことを行うことができます。

于 2009-08-20T23:31:37.587 に答える
1

グレッグのアプローチは正しいと思います。詳しく説明すると、毎日変更されるリソースを提供する必要はないと思います/daily-report。なぜなら、火曜日の 11:59 にレポートを実行すると、水曜日の 00:01 にレポートを実行する場合とは異なる結果が得られるため、A) クライアントにとって混乱を招く可能性があるからです。リソースが同じであることを期待し、B) クライアントが 1 日が経過した後に前日のデータを取得することを許可しません。クライアントがいつでも必要な情報にアクセスできるように、利用可能な日次レポートごとに一意のリソース識別子を提供する必要があります。

于 2009-08-20T22:16:48.457 に答える