Metoda PATCH

Metoda PATCH

Zajmiemy się także metodą PATCH. Nie jest ona wprawdzie częścią standardu HTTP, jednak dość dobrze uzupełnia go w kwestii operacji częściowego aktualizowania danych. Przypomnijmy, że metoda PUT służy do zastąpienia danego zasobu, zaś POST do jego wstawienia. W sytuacji, gdy potrzebujemy zaktualizować tylko kilka właściwości rekordu, zastosujemy metodę PATCH.

W treści wiadomości PATCH znajduje się ciąg informacji o tym, jakie pole i w jaki sposób zmienić. Jeżeli wskazywany zasób jeszcze nie istnieje, może on zostać utworzony, jeżeli informacje o zmianach zawierają wszelkie wymagane parametry.

PATCH /resource HTTP/1.1
Host: www.example.com
Content-Type: application/json
If-Match: "a1b2c3d4"

[
  { "op": "replace", "path": "/prop", "value": 42 },
]

Z uwagi na to, że niektóre instrukcje zmiany wartości bazują na poprzedniej wartości danej właściwości (np. dołączenie tekstu) spory problem może stanowić równoczesne wykonywanie tych operacji. Stan po wykonaniu różnych operacji może nie być jednoznacznie określony, więc szczególnie istotne jest korzystanie z zapytań warunkowych.

Kolejną istotną właściwością tego typu operacji jest jej atomowość. Zestaw zmian zdefiniowany w zapytaniu powinien być naniesiony w całości lub w ogóle.

Wyróżniamy dwie możliwości sprawdzenia, czy możliwe jest używanie metody PATCH dla danego zapytania:

  • Użycie metody OPTIONS,
  • Odczytanie nagłówka Accept-Patch w odpowiedzi serwera.

Jak widać w powyższym przykładzie treść wiadomości PATCH powinna mieć specjalny format. Wynika to z charakteru omawianej metody i tego, że obsługuje ona tylko informacje o zmianach. Jeden z możliwych formatów wiadomości jest opisany w standardzie http://tools.ietf.org/html/rfc6902 Wygląda on następująco:

[
  { "op": "test", "path": "/prop", "value": "foo" },
  { "op": "remove", "path": "/prop" },
  { "op": "add", "path": "/prop", "value": [ "foo", "bar" ] },
  { "op": "replace", "path": "/prop", "value": 12 },
  { "op": "move", "from": "/prop", "path": "/prop2" },
  { "op": "copy", "from": "/prop", "path": "/prop2" }
]

Możliwe operatory to:

  • Add
  • Remove
  • Replace
  • Move
  • Copy
  • Test

Są to informacje o zmianach w formacie JSON. Możliwe jest także przesyłanie delt dla zmian w formacie XML http://tools.ietf.org/html/rfc5261, jednak nie będziemy się tym szerzej zajmować.

Istnieje wiele implementacji mechanizmu PATCH. Przykładem implementacji dla .NET jest https://github.com/myquay/JsonPatch

Informacje dodatkowe:

http://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/
https://www.mnot.net/blog/2012/09/05/patch