2010-12-17 10 views
11

Po prostu zaczynam od REST i czytałem post i wspomnianą o REST response codes. Kiedy patrzę na Play Controller klasy jednak wydaje się być ograniczony do powrotuPowracające kody odpowiedzi RESTful w Play

  • 200 - OK
  • 301 - Przeniesiono na stałe
  • 302 - Znaleziony
  • 304 - Not Modified
  • 400 - Bad Request
  • 401 - Not Authorized
  • 403 - Forbidden
  • 404 - Nie znaleziono
  • 5xx

To wydaje się pomijać niektóre potencjalnie przydatnych kodów, które zostały wymienione:

  • 201 - Utworzone (dobra odpowiedź dla pomyślnego JSON postu?)
  • 202 - Honorowane (dla żądań w kolejce)
  • 204 - Brak treści (możliwe odpowiedzi dla udanego PUT/POST/DELETE)
  • 307 - Temporary Redirect
  • 405 - Method Not Allowed
  • 406 - Nie Akceptowalny
  • 409 - Konflikt
  • 410 - Przeminęło
  • 415 - nieobsługiwany Typ nośnika (to wydaje się, że właściwą odpowiedzią na wniosek o formacie JSON, gdy nie JSON szablon jest zdefiniowany)

Czy mimo wszystko nie są potrzebne? Czy Play radzi sobie z tymi sytuacjami automatycznie?

Wygląda również na to, że jeden kontroler nie może obsłużyć żądań REST i zwykłych żądań stron WWW dla tego samego zasobu, ponieważ strony internetowe są zawsze zwracane z 200. Czy brakuje mi tam czegokolwiek?

Odpowiedz

11

Patrząc na kod play Źródło (Play 1.1) na obiekt play.mvc.Http.StatusCode, Play wydaje się mieć następujące kody

public static final int OK = 200; 
public static final int CREATED = 201; 
public static final int ACCEPTED = 202; 
public static final int PARTIAL_INFO = 203; 
public static final int NO_RESPONSE = 204; 
public static final int MOVED = 301; 
public static final int FOUND = 302; 
public static final int METHOD = 303; 
public static final int NOT_MODIFIED = 304; 
public static final int BAD_REQUEST = 400; 
public static final int UNAUTHORIZED = 401; 
public static final int PAYMENT_REQUIERED = 402; 
public static final int FORBIDDEN = 403; 
public static final int NOT_FOUND = 404; 
public static final int INTERNAL_ERROR = 500; 
public static final int NOT_IMPLEMENTED = 501; 
public static final int OVERLOADED = 502; 
public static final int GATEWAY_TIMEOUT = 503; 

Wskazywałoby to potwierdzenie niektóre kody swój zostały zidentyfikowane, takich jak 201, 202, 204. Nie ma jednak wartości 307, 405, 406, 409, 410 i 415.

Również 201, 202, 204 są potwierdzone, ale nie są nigdzie w bazie kodu źródłowego. Więc jeśli serwer Netty lub jeden z dostarczonych plików jar nie zarządza nimi w Play (czego nie jestem pewien, czy może to zrobić), nie widzę, jak Play może w magiczny sposób poradzić sobie z tymi sytuacjami bez znajomości podstawy kodu.

Patrząc na kod dla renderJSON, nie wydaje się, aby ustawić kod stanu jako część wysyłania wyników z powrotem (tak używa domyślnie 200), więc hack następujące może praca.

public static void myJsonAction() { 
    response.status = 201; 
    renderJSON(jsonString); // replace with your JSON String 
} 
+0

Testowałem na ustawienie 'response.status' i na pewno wystarczy, to tylko takie proste. –

+0

Jakiś pomysł, gdzie te stałe są w Play 2.x? A może Play 2.x Scala? –

+0

Znaleziono kody odpowiedzi Scala 2.x, np. play.api.mvc.Results # NoContent –

4

W obecnej wersji odtwarzania trzeba użyć status() zamiast. Przykład:

status(201, jsonData); 

W Scala to powinno działać jak w tym przykładzie zaczerpnięte z official docs:

Status(488)("Strange response type") 
+0

jak mogę go używać w scala, szukałem tam nie ma metody jak status() –