0

(これは Rails に固有のものではありませんが、Rails 構成を使用して質問します)。

TL;DR

ユーザーが URI をアドレス バーに入力すると、実際には GET ではなく PUT 操作になるのでしょうか?

詳細

最近読み取った値のコピーを (効率のために) データベースに保持する Web 対応の Gauge があるとしますが、ユーザーはキャッシュされた値を更新する更新を要求できます。したがって、ルートは次のようになります。

VERB | URI Pattern       | Effect
-----+-------------------+------------------------------------
GET  | /gauge/:id        | show the cached state of gauge #id
PUT  | /gauge/:id/update | update the cached state of gauge #id

ゲージのキャッシュ状態を表示することにしました。これGETは、GET を何回実行しても結果が変わらないためです。http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.htmlの用語では、GET 操作はべき等です。したがってGET /gauge/33、ゲージ #33 のキャッシュされた値をフェッチします。

私がRFC2616を理解している限り、状態は呼び出しごとに変化する可能性がPUTあるため、aを使用してローカル状態を更新する必要があります。これはべき等ではありません。別の言い方をすると、データベースに副作用が生じます。PUT /gauge/33/update

今: 私が RCF2616 を誤解している場合は、ここで止めてください。

質問

私の質問は非常に単純です。ユーザー/gauge/33/updateがブラウザのアドレス バーに入力するとどうなるでしょうか? サーバーには として表示されますがGET /gauge/33/update、それに一致するルートはありません。

同じ URI パターンに対して GET と PUT の両方を含むルートを設定するのは一般的な方法ですか? つまり、ルーティング テーブルを次のように設定できます。

VERB | URI Pattern       | Effect
-----+-------------------+------------------------------------
GET  | /gauge/:id        | show the cached state of gauge #id
PUT  | /gauge/:id/update | update the cached state of gauge #id
GET  | /gauge/:id/update | perhaps the same as PUT (but see below)

このアプローチに関する私の懸念は、ユーザーがGET /gauge/33/update連続して 2 回 (またはそれ以上) 呼び出した場合、サーバーは、GET がべき等操作を通知するため、実際には更新を実行する必要がないと判断する可能性があることです。

私はただ衒学的ですか?または、RFC2616 を誤解していますか?

4

2 に答える 2

0

エラー 405 が発生するはずです。

HTTP/405 wrong method

参照: http コード

于 2014-12-06T07:29:41.703 に答える
0

サーバーには GET /gauge/33/update として表示されますが、それに一致するルートはありません。

ルートがない場合は、404 エラー (または Jasen によると 405) が読み込まれます。ブラウザー内のアドレス バーにアドレスを入力して、サーバーに PUT 要求を送信することはできません。

Rails パス メソッドを使用する場合、ユーザーを update メソッドではなく show アクションに送りたいと思うでしょう。したがってgauge_path(@gauge)、パスを生成するために使用します。これは、 /gauge/123(DB 内のゲージの ID であると仮定します。プットを実行する必要があるのは、ゲージを更新するときのフォーム内のみです。次のようになります。

メソッドが PUT として設定されたフォームを作成します。

詳細については、こちらをご覧ください。

于 2014-12-06T07:30:17.140 に答える