2010-12-17 8 views
11

Ich bin gerade mit REST und ich habe gelesen this Beitrag und die erwähnte book über REST response codes. Wenn ich aber sehen Controller Klasse Play, so scheint es, auf die RückkehrRückgabe RESTful Antwort-Codes in Play

  • 200 begrenzt werden - OK
  • 301 - Dauerhaft verschoben
  • 302 - Gefunden
  • 304 - Modifizierte Nicht
  • 400 - Bad Request
  • 401 - Nicht
  • Autorisierte
  • 403 - Verboten
  • 404 - Nicht gefunden
  • 5xx

, dass einige potenziell nützliche Codes auszulassen scheint, die erwähnt wurden:

  • 201 - Erstellt (gute Antwort für eine erfolgreiche JSON Post?)
  • 202 - Accepted (für Anfragen in der Warteschlange)
  • 204 - Kein Inhalt (mögliche Antwort für erfolgreichen PUT/POST/DELETE)
  • 307 - Temporäre Umleitung
  • 405 - Methode nicht
  • 406 erlaubt - Nicht akzeptabel
  • 409 - Conflict
  • 410-
  • gegangenes
  • 415 - Nicht unterstützter Medientyp (dies scheint, wie die angemessene Antwort auf eine Anforderung für JSON-Format, wenn kein JSON Vorlage ist definiert)

Werden diese überhaupt nicht benötigt? Behandelt Play diese Situationen automatisch?

Es scheint auch, dass ein Controller REST-Anforderungen und normale Webseitenanforderungen für die gleiche Ressource nicht gut behandeln kann, da die Webseiten immer mit 200 zurückgegeben werden. Fehle ich da etwas?

Antwort

11

Mit Blick auf die Play-Quellcode (Play-1.1) am play.mvc.Http.StatusCode Objekt, spielen die folgenden Codes

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; 

Diese zeigen würde Bestätigung einiger der Codes zu haben scheint Ihre identifiziert haben, wie zum Beispiel 201, 202, 204. Die Werte 307, 405, 406, 409, 410 und 415 sind jedoch nicht vorhanden.

Auch 201, 202, 204 werden bestätigt, aber nirgendwo anders im Quellcode referenziert. Also, es sei denn, der Netty-Server oder eine der mitgelieferten JAR-Dateien verwaltet diese für Play (was ich nicht sicher bin), kann ich nicht sehen, wie Play magisch mit diesen Situationen umgehen kann, ohne die Codebasis zu kennen.

Mit Blick auf den Code für renderJSON, scheint es nicht, den Statuscode als Teil des Sendens der Ergebnisse zurück (so verwendet die Standardeinstellung 200), so dass der folgende Hack kann arbeiten.

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

Ich testete Einstellung 'response.status' und sicher genug, es ist nur so einfach. –

+0

Irgendeine Idee, wo diese Konstanten in Play 2.x sind? Wie wäre es mit Play 2.x Scala? –

+0

Die Scala 2.x-Antwortcodes gefunden, z. play.api.mvc.Results # NoContent –

4

In der aktuellen Play-Version haben Sie status() stattdessen zu verwenden. Beispiel:

status(201, jsonData); 

In Scala sollte es wie in diesem Beispiel aus den official docs genommen arbeiten:

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

wie kann ich es in scala verwenden, ich habe gesucht es gibt keine methode wie status() –