20

私は次のような通常の基本的なRESTAPIを持っています:

/
    GET - list
    POST - create

/<id>
    GET - detail
    PUT - replace
    PATCH - patch
    DELETE - delete

POSTが入ってくると/、私は通常、オブジェクトを作成して新しいIDを作成します。フィールドのいくつか(1つ)は一意である必要があります。したがって、このような重複データを含むPOSTは、次の結果になる可能性があります。

  1. 500-IntegrityError
  2. PUT/ PATCHtoのようにして/<id>、既存のレコードを更新します
  3. エラーをキャッチ/回避し、ある種のを返します4XX
  4. 私が考えていない何か他のもの。

1リクエストが悪いか、私が対処できるかのどちらかです。この状況を処理する正しい方法は何ですか?

4

2 に答える 2

27

@StevenFisherは正しいです。409 Conflictが正しい応答です。

リソースの現在の状態と競合するため、要求を完了できませんでした。このコードは、ユーザーが競合を解決してリクエストを再送信できると予想される状況でのみ許可されます。応答本文には、ユーザーが競合の原因を認識するのに十分な情報を含める必要があります。理想的には、応答エンティティには、ユーザーまたはユーザー エージェントが問題を解決するのに十分な情報が含まれます。ただし、それは不可能な場合があり、必須ではありません。

たとえば、 / に対する GET は、次のようにユーザーを作成できることをクライアントに伝える場合があります。

HTTP/1.1 200 OK
<users href="/">
    <create href="/" method="post">
        <username type="xs:token" cardinality="required"/>
        <password type="password" cardinality="required"/>
    </create>
    ... other hypermedia controls, like search ...
</users>

ハイパーメディア コントロールに従って、「Skylar Saveland」というユーザー名でユーザーを作成しようとすると、

HTTP/1.1 409 Conflict
<users href="/">
    <create href="/" method="post">
        <username type="xs:token" cardinality="required" 
                  error="The username 'Skylar Saveland' is already taken. Please select another username"/>
        <password type="password" cardinality="required"/>
    </create>
    ... other hypermedia controls, like search ...
</users>

同様に、パスワードなしでユーザーを作成しようとすると、

HTTP/1.1 409 Conflict
<users href="/">
    <create href="/" method="post">
        <username type="xs:token" cardinality="required"/>
        <password type="password" cardinality="required" 
                  error="A password must be specified"/>
    </create>
    ... other hypermedia controls, like search ...
</users>

または、複数のエラーがある可能性があります。

HTTP/1.1 409 Conflict
<users href="/">
    <create href="/" method="post">
        <username type="xs:token" cardinality="required"
                  error="The username 'Skylar Saveland' is already taken. Please select another username"/>
        <password type="password" cardinality="required"
                  error="A password must be specified"/>
    </create>
    ... other hypermedia controls, like search ...
</users>

注: 上記に沿って適切なメディア タイプを作成する必要があります。これにより、ハイパーメディア コントロールの構造 (フォームのエラー属性を含む) が説明され、さまざまな要素名 (users、ユーザー名、パスワードなど)。

于 2012-09-30T12:44:56.353 に答える
2

#3がより適切です。5xxエラーは、サーバーに問題がある場合に発生します。4xxエラーは、リクエストに問題がある場合です。この場合、リクエストは間違っているため、4xxの方が適切です。400または409のいずれか。

または、コンテキストに応じて、#2を実行できます。

于 2012-09-30T04:21:20.077 に答える