6

私はいくつかのRESTAPIを開発するための岐路に立っていますが、どちらかをしっかりと守ることはできませんが、このテーマに関する実際の議論は見つかりませんでした。

私は、RESTを/<resource>/<action>使用するとURLとして使用できることを理解しています

したがって、ユーザーを無効にするには、次のようにします。

PUT /user/disable

合理的なようです。ただし、より基本的な方法については議論が続いています。

それは次のようになります:

POST /user  (creates a user *implicitly*)
POST /user/create (creates a user *explicitly*)

DELETE /user/:id
DELETE /user/:id/delete

1つ目は「標準」と見なされるもののようで、2つ目はその意図が明らかにはるかに明確であり、/ user/disableなどのメソッドと一致しています。

たぶん、この議論は他の場所で激しさを増していますが、私はそれを見たことがありません。あなたがこれについて「宗教的」であるならば、今があなたの教訓となるチャンスです

4

3 に答える 3

5

URLとして持つこと/<resource>/<action>はRESTではありません。RESTは、HTTP動詞を使用して、特定のリソースまたはリソースのコレクションに対して実行するアクションを決定します。つまり、次のことを意味します。

  • リソースの作成は次のとおりです。POST /users
  • リソースの読み取りは次のとおりです。GET /users/<id>
  • リソースの更新(実際の置換)は次のとおりです。PUT /users/<id>
  • リソースの削除は次のとおりです。DELETE /users/<id>

それがRESTです。

他のすべてのメソッドでは、のような他の動詞を使用できますPATCH。ユーザーを無効にするには、次のようにします。

PATCH /users/<id>/disable

純粋なRESTではありませんが、問題ありません。

編集: RESTに準拠する場合、ユーザーを無効にすると、ユーザーの状態を変更する必要があります。stateつまり、フラグなどのプロパティの1つを変更する必要があります。リソースに「パッチを適用」できます。

PATCH /users/<id>?state=disabled

これはRESTです。PUTコメントで説明されているように、を使用してリソースを置き換えることもできます。

于 2012-08-16T07:57:48.727 に答える
2

@クリスチャンボンジョルノ

あなたはRESTとは何の関係もないURIでアクションをエンコードしています。これは、RPCの最も明確な形式です。

リソースを識別し、使用する基になるプロトコル(つまり、この場合はHTTP)で定義されたメソッドを使用して、これらのリソースに対してアクションを実行する必要があります。HTTP仕様では、これらのメソッドのセマンティクスが定義されているため、アクションをURIに直接エンコードする代わりに、次の手順を実行する必要があります。

  • GET / users-ユーザーのリストを返します(特定のユーザーへの独自のリンクを持つ各エントリ/アイテム)
  • GET / users /:id-特定のユーザーを返します
  • POST /users-/usersリソースの下に新しいユーザーを作成します
  • POST / users /:id-ユーザーを編集します(または、ここでPATCHメソッドを使用できます)
  • PUT / users /:id-ユーザーを置き換えます
  • DELETE / users /:id-ユーザーを削除します

これはあなたが行動について考える方法です。ただし、これらのアクションを説明できるようにするには、リンクなどのハイパーメディアコントロール(少なくとも)をサポートするメディア形式を使用する必要があります。たとえば、次を参照してください。

いくつかの簡単な相互作用の例:

***Request***
GET /users HTTP/1.1
Host: service.org
Accept: application/x+json

***Response***
HTTP/1.1 200 OK
Content-Type: application/x+json
Content-Length: ...

[{
  "name": "john",
  "links": {
    "self": "/users/1",
    "edit": "/users/1"
  }
}, {
  "name": "jane",
  "links": {
    "self": "/users/2",
    "edit": "/users/2"
  }
}]

***Request***
GET /users/2 HTTP/1.1
Host: service.org
Accept: application/x+json

***Response***
HTTP/1.1 200 OK
Content-Type: application/x+json
Content-Length: ...
{
  "name": "jane",
  "links": {
    "self": "/users/2",
    "edit": "/users/2"
  }
}

***Request***
DELETE /users/2 HTTP/1.1
Host: service.org

***Response***
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: ...

Resource was destroyed...

***Request***
POST /users/2 HTTP/1.1
Host: service.org
Content-Type: application/x+json
Content-Lenght: ...

{"status": "disabled"}

***Response***
HTTP/1.1 303 See Other
Location: /users/2
于 2012-08-16T07:56:44.093 に答える