次のシナリオがあるとします。
教師エンティティ
{
"id": "1234",
"name": "Mr. Didactic",
"Subject": "History",
"Classroom": "1A"
}
REST APIエンドポイント:
/teacher/id/1234
POST(update)リクエストをエンドポイントに次のリクエスト本文で送信するとします。
{
"id": "1234",
"name": "Mr. Didactic",
"Subject": "History"
}
それをどのように処理/解釈すべきですか? Classroom
はnull /空に設定するように要求されていますか?
それとも手付かず、つまりClassroomに対して何もしない、それはリクエストの一部ではないのですか?
または、これを解釈する他の方法はありますか?何が期待されているか、またはここでのベストプラクティスは何ですか?
更新(POST)リクエストの場合、省略されているフィールドは変更しないでください。フィールドをその値からクリアするには、値null
または通常の値を使用してリクエストに記述し、値を完全に変更する必要があります。
あなたの例では、Classroom
は値1A
を保持します。
ドキュメントの置換(PUT)リクエストの場合、すべてのフィールドがクリアされ、リクエスト内の内容で置き換えられます。したがって、フィールドが省略されると、フィールドはクリアされます。
この例では、PUTリクエストを送信すると、Classroom
はnull
になります。
POSTを作成リクエストとして使用する場合、省略されたフィールドは設定されないため、Classroom
はnull
のままです。
これは、少なくとも jsonapi.org 仕様(RESTサービス)でのJSON応答の仕様)で指定されている方法です。
リクエストにリソースのすべての属性が含まれていない場合、サーバーは、欠落している属性を、現在の値に含まれているかのように解釈する必要があります。サーバーは、欠落している属性をnull値として解釈してはなりません(MUST NOT)。
ODataのような他の仕様も同じ動作を記述しています。しかし、実装された動作を文書化する限り、それはあなたの選択です。