2012-09-30 3 views
11

私のような、通常の、基本的なREST APIを持っている:残りのAPIデザイン:重複したデータを作成するPOST、IntegrityError/500となるでしょう、何が正しいでしょうか?

/ 
    GET - list 
    POST - create 

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

POSTが/に入って来たとき、私は通常、オブジェクトを作成し、新しいIDを作成します。一部のフィールドは一意である必要があります。 /<id>によりPUT/PATCHのようにそれを作成し、既存のレコード

  • がキャッチ/エラーを回避し、いくつかを返す更新IntegrityError
  • -

    1. 500:だから、そのような重複データとPOSTはにつながる可能性並べ替え4XX
    2. 他に何か考えていない。

    1が出ているようです:リクエストが悪いか、それに対処できます。この状況に対処する正しい方法は何ですか?

  • +2

    私は409、 "Conflict"に行きます。しかし、私はそれが「正しい」方法であると主張するつもりはない。 :) –

    答えて

    14

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

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

    、ハイパーメディア制御に従い、ユーザ名「Skylar Saveland」を持つユーザーを作成しようとして

    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> 
    

    次のように彼らは、ユーザーが作成できることをクライアントに伝えるかもしれない/上GET可能性があります

    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> 
    

    注:適切なmedia type will need to be createdハイパーメディアコントロールの構造を説明しますこれは、上記と一緒に行くために(エラーを含むフォームの属性)と様々な要素名(例えば、ユーザー、ユーザー名、パスワードなど)の意味を定義します。

    1

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

    または、実際にはコンテキストに依存します。

    +1

    #2が正しくありません。 IDを持たないPOSTは、要求を更新するために使用されるべきではありません。 – igorsantos07

    関連する問題