HTTPメソッド中、PUTとPATCHはリソースをUPDATEするとき使用する。同じ機能だと勘違いしやすい2つのリクエストには若干の違いがある。
Mapping Annotationの@PatchMappingで簡単に書いたことがあるがもう一回整理してみる。
PUT:リソースのすべてを更新する。
PATCH:リソースの一部を更新する。
下のようなリソースがあるとする。
id | name | address | gender |
---|---|---|---|
1 | Kim | Seoul | M |
2 | Mari | Tokyo | F |
3 | Luis | Madrid | M |
-
PUT
(1)リソースのすべての項目にUpdateリクエスト
PUT /id/1
{
name : "Jane",
address : "NY",
gender : "F"
}
結果:id1のデータがすべてUpdateされる。
id | name | address | gender |
---|---|---|---|
1 | Jane | NY | F |
2 | Mari | Tokyo | F |
3 | Luis | Madrid | M |
(2)リソースの一部の項目にUpdateリクエスト
PUT /id/1
{
address : "LA"
}
結果:リクエストしてない項目もUpdateされるため、id1のnameとgenderはNullになる。
id | name | address | gender |
---|---|---|---|
1 | LA | ||
2 | Mari | Tokyo | F |
3 | Luis | Madrid | M |
(3)リクエストしたリソースがない時
PUT /id/4
{
name : "Victoria",
address : "London",
gender : "F"
}
結果:以下のように新しいリソースが追加される。
id | name | address | gender |
---|---|---|---|
1 | Kim | Seoul | M |
2 | Mari | Tokyo | F |
3 | Luis | Madrid | M |
4 | Victoria | London | F |
-
PATCH
(1)リソースのすべての項目にUpdateリクエスト
PATCH /id/1
{
name : "Jane",
address : "NY",
gender : "F"
}
結果:PUTと同じくid1のデータがすべてUpdateされる。
id | name | address | gender |
---|---|---|---|
1 | Jane | NY | F |
2 | Mari | Tokyo | F |
3 | Luis | Madrid | M |
(2)リソースの一部の項目にUpdateリクエスト
PATCH /id/1
{
address : "LA"
}
結果:リクエストした項目のみUpdateされるため、id1のnameとgenderは元のデータを維持する。
id | name | address | gender |
---|---|---|---|
1 | Kim | LA | M |
2 | Mari | Tokyo | F |
3 | Luis | Madrid | M |
(3)リクエストしたリソースがない時
PUT /id/4
{
name : "Victoria",
address : "London",
gender : "F"
}
結果:新しいリソースは追加されない上、ServerはClient ErrorをResponseとして返す。
id | name | address | gender |
---|---|---|---|
1 | Kim | Seoul | M |
2 | Mari | Tokyo | F |
3 | Luis | Madrid | M |
まとめ
- PUT:リソースのすべてを更新するため、リクエストしなかった項目もNullとしてUpdateされる。
- PATCH:リソースの一部を更新するため、リクエストしなかった項目は元のデータを維持する。