2011-06-28 11 views
8

Mam usługę WWW RESTful, która reprezentuje procesy i działania. Każde działanie jest w jednym i tylko jednym procesie. Chciałbym reprezentować operację "przenoszenia" aktywności między procesem, w którym obecnie się znajduje, a innym procesem.Przenoszenie zasobów w architekturze RESTful

Przeglądam fora i stwierdzam, że ludzie sugerują użycie operacji MOVE, która nie jest zbyt standardowa, a inne sugerują użycie PUT, ale nie jestem pewna, jak odróżnić PUT tą aktualizację od PUT, która porusza się, wygląda semantycznie źle.

Wszelkie pomysły?

Odpowiedz

3

Jeśli używasz PUTs, możesz odróżnić, czy proces istniejącej jednostki pasuje do nowego.

PUT /process1/activity2\n\n 
process: 2 
some_data: and_stuff 

Aby którym odpowiedź logiczny (w razie powodzenia) jest

303 See Other\n 
Location /process2/activity2 
+0

Możesz również użyć "204 Brak treści" zamiast 303: http://grzegorzborkowski.blogspot.nl/2009/04/relocating-resources-with-restful-web.html – mb21

8

Jednym ze sposobów może być do reprezentowania ruch siebie jako, powiedzmy, „przenieść” zasób (przelew jako rzeczownik) i zamieścić nowe:

POST /transfer 

z podmiotem zawierającym:

activity: /activities/4 
toProcess: /processes/13 

W ten sposób klienci tworzą nowe "transfery", które na serwerze obsługują sprawdzanie i przesyłanie aktywności.

Daje to możliwość dodawania informacji o transferze. Jeśli chcesz zachować historię do audytu, możesz dodać właściwość transferredBy do zasobu lub datę transferredOn.

+0

Cześć, jest to ciekawy pomysł. Nie myślałem o użyciu samego transferu jako zasobu, ale myślę, że właśnie o to chodzi w REST. Myślisz, że to dobrze, że tworząc (wysyłając) nowy zasób transferu inny zasób zostanie zmieniony? –

+1

Tak, to jest w porządku. POST nie musi być [idempotent] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2), więc może mieć efekty uboczne. –

+0

+1. Tak też myślałem. Myślę, że jest to czystsze niż PUT na zawartym elemencie, ilekroć ruch powinien dotyczyć zarówno kontenera (jego listy zawartych elementów), jak i zawartego elementu (jego pole łącza nadrzędnego). Zastanawiam się jednak, czy REST to czystość w tym sensie. Czy można założyć, że ktoś inny ma PUTs na rodzica, kiedy PUT na dziecko? A może powinniśmy dbać o to, aby być RESTENCYJNIE poprawnym, nawet patrząc na kompletny zestaw faktycznych żądań każdego klienta? –