web-dev-qa-db-ja.com

REST API-省略されたプロパティPOSTリクエスト:それらはどのように処理されるべきですか?

次のシナリオがあるとします。

  1. 教師エンティティ

    {  
    "id": "1234",  
    "name": "Mr. Didactic",  
    "Subject": "History",  
    "Classroom": "1A"  
    }
    
  2. REST APIエンドポイント:

    /teacher/id/1234
    

POST(update)リクエストをエンドポイントに次のリクエスト本文で送信するとします。

{  
"id": "1234",  
"name": "Mr. Didactic",  
"Subject": "History"
}

それをどのように処理/解釈すべきですか? Classroomはnull /空に設定するように要求されていますか?

それとも手付かず、つまりClassroomに対して何もしない、それはリクエストの一部ではないのですか?

または、これを解釈する他の方法はありますか?何が期待されているか、またはここでのベストプラクティスは何ですか?

4
richard

更新(POST)リクエストの場合、省略されているフィールドは変更しないでください。フィールドをその値からクリアするには、値nullまたは通常の値を使用してリクエストに記述し、値を完全に変更する必要があります。
あなたの例では、Classroomは値1Aを保持します。

ドキュメントの置換(PUT)リクエストの場合、すべてのフィールドがクリアされ、リクエスト内の内容で置き換えられます。したがって、フィールドが省略されると、フィールドはクリアされます。
この例では、PUTリクエストを送信すると、Classroomnullになります。

POSTを作成リクエストとして使用する場合、省略されたフィールドは設定されないため、Classroomnullのままです。

これは、少なくとも jsonapi.org 仕様(RESTサービス)でのJSON応答の仕様)で指定されている方法です。

リクエストにリソースのすべての属性が含まれていない場合、サーバーは、欠落している属性を、現在の値に含まれているかのように解釈する必要があります。サーバーは、欠落している属性をnull値として解釈してはなりません(MUST NOT)。

ODataのような他の仕様も同じ動作を記述しています。しかし、実装された動作を文書化する限り、それはあなたの選択です。

6
David Perfors

これらの 差分更新 を呼び出すOData標準によって、良い例が示されると思います。

リソースの追加にはPOSTを使用し、リソースを置き換えるにはPUTを使用する必要があります(PUTは べき等 )。

PATCHが標準ではなかったとき、ODataは実際に、質問の状況に対処するためだけにMERGEメソッドを導入しました。実際、OData 3.0はMERGEが廃止され、公式PATCHを支持することを宣言しています。

とにかく、POST不足しているプロパティをnullに設定する必要があります。 またはそれらを削除します

参照: REST API?

1
bigstones