2010-08-01 12 views
12

Ponieważ żądanie POST w szablonie POST/Przekierowanie/GET (PRG) zwraca kod przekierowania (303 See Other) w przypadku sukcesu, czy w ogóle możliwe jest poinformowanie klient o specyficznym smaku powodzenia, którym ma się cieszyć (np. OK, Stworzony, Zaakceptowany itd.), a także wszelkich odpowiednich nagłówków (np. Location dla 201 Created, które mogłyby kolidować z przekierowaniem)?POST/Przekierowanie/GET (PRG) vs. znaczące kody odpowiedzi 2xx

Może to być na przykład odpowiednie, aby przekierowany GET odpowiedział odpowiednimi kodami odpowiedzi &, których można się spodziewać po odpowiedzi POST?

HTTP 1.1 Spec mówi:

Metoda [303] istnieje głównie w celu umożliwienia wyjścia POST aktywowanego skryptu przekierować agenta użytkownika do wybranego surowca.

Ale nie oferuje żadnego wglądu w utratę częstszego kodu statusu i nagłówków.

Edit - Przykład:

Klient wysyła żądanie POST do /orders która tworzy nowy zasób w /orders/1.

Jeśli serwer wysyła stan 201 Created z location: /orders/1, zautomatyzowany klient będzie zadowolony, ponieważ wie, że zasób został utworzony i wie, gdzie on jest, ale człowiek używający przeglądarki będzie niezadowolony, ponieważ dostanie strona /orders ponownie, a jeśli go odświeżą, to wyślą kolejne zamówienie, co raczej nie będzie tym, czego chcą.

Jeśli serwer wyśle ​​stan 303 See Other z location: /orders/1, człowiek zostanie zabrany na jego zamówienie, poinformowany o jego istnieniu i stanie i nie będzie mu groziło powtórzenie przez przypadek. Zautomatyzowany klient nie zostanie jednak wyraźnie poinformowany o tworzeniu zasobu, będzie musiał wywnioskować tworzenie w oparciu o nagłówek location. Co więcej, jeśli przekierowania 303 gdzie indziej (np. /users/someusername/orders) człowiek może być dobrze przystosowany, ale automatyczny klient pozostaje drastycznie niedoinformowany.

Moja sugestia to wysłanie 201 Created jako odpowiedzi na przekierowane żądanie otrzymania nowego zasobu, ale im więcej o tym myślę, tym mniej mi się podoba (może to być trudne, aby zapewnić, że tylko twórca otrzyma numer 201 i nie powinno się wydawać, że żądanie GET utworzyło zasób).

Jaka jest optymalna reakcja w tej sytuacji?

+0

Czy możesz podać przykład tego, co myślisz? – Gumbo

+0

Edytowałem pytanie, aby podać przykład. Dzięki. –

+0

Wystarczy jednoznacznie: Zapewniłeś już, że ludzki użytkownik będzie dobrze poinformowany o tym, co się właśnie wydarzyło, a teraz próbujesz zrobić to samo dla zautomatyzowanego? – sdleihssirhc

Odpowiedz

1

Jeśli masz kontrolę nad serwerem sieciowym, co z rozróżnieniem nagłówka agenta? Wypełnij go czymś, co tylko wiesz (identyfikator GUID lub inne pseudolosowe) i przedstaw je na serwerze sieciowym za pośrednictwem automatycznego klienta. Następnie odpowiedz na webserver odpowiednio 201/303.

3

Wysyłaj informacje kierowane przez ludzi do treści odpowiedzi jako HTML. Nie rozróżniaj nagłówków User-Agent; jeśli musisz wysłać ciała do maszyn, rozróżnij na podstawie nagłówka żądania Accept.