26

I have a resource that has a counter. For the sake of example, let's call the resource profile, and the counter is the number of views for that profile.

Per the REST wiki, PUT requests should be used for resource creation or modification, and should be idempotent. That combination is fine if I'm updating, say, the profile's name, because I can issue a PUT request which sets the name to something 1000 times and the result does not change.

For these standard PUT requests, I have browsers do something like:

PUT /profiles/123?property=value&property2=value2

For incrementing a counter, one calls the url like so:

PUT /profiles/123/?counter=views

Each call will result in the counter being incremented. Technically it's an update operation but it violates idempotency.

I'm looking for guidance/best practice. Are you just doing this as a POST?

4

4 に答える 4

14

PATCHを使うのが正解だと思います。カウンターをアトミックにインクリメントするために使用することを推奨している人は他にいませんが、RFC 2068はすべて非常にうまくいっていると思います。

PATCH メソッドは PUT に似ていますが、エンティティには、Request-URI によって識別されるリソースの元のバージョンと、PATCH アクションが適用された後のリソースの目的のコンテンツとの違いのリストが含まれている点が異なります。違いのリストは、エンティティのメディア タイプ (例: "application/diff") によって定義された形式であり、サーバーが元のバージョンのリソースを目的のバージョンに変換するために必要な変更を再作成できるようにするために十分な情報を含める必要があります。バージョン。

したがって、プロファイル 123 のビュー カウントを更新するには、次のようにします。

PATCH /profiles/123 HTTP/1.1
Host: www.example.com
Content-Type: application/x-counters

views + 1

メディアx-countersタイプ (私が作成したもの) は、複数行のfield operator scalarタプルで構成されています。views = 500or views - 1orviews + 3はすべて構文的に有効です (ただし、意味的に禁止されている場合があります)。

さらに別の種類のメディアを作成することに眉をひそめることは理解できますが、POST / PUT の代替よりも正しいことを謙虚に提案します。独自の URI と特に独自の詳細 (実際には保持していません。私が持っているのは整数だけです) を備えたフィールドのリソースを作成することは、私には間違っていて面倒に思えます。23 の異なるカウンターを維持する必要がある場合はどうなりますか?

于 2012-02-08T13:14:47.053 に答える
1

以前の回答を評価した後、私は PATCH が不適切であると判断し、私の目的のために、些細なタスクのために Content-Type をいじるのはKISS の原則に違反していました。n+1 をインクリメントするだけでよかったので、次のようにしました。

PUT /profiles/123$views
++

どこ++にメッセージ本文があり、コントローラによってリソースを 1 ずつインクリメントする命令として解釈されます。

$リソースのフィールド/プロパティを区切ることを選択しました。これは正当なサブデリミタ/であり、私の目的では、トラバーサビリティの雰囲気を持っているものよりも直感的であるように思われました。

于 2017-06-30T17:35:32.607 に答える