5

私はPlayでcreateアクションを持っています! HTTPステータスコードCreatedを返し、クライアントを作成されたオブジェクトの場所にリダイレクトする必要があります。HTTPステータスがPlayで「作成済み」に戻ります。フレームワーク

public class SomeController extends Controller { 

    public static void create() { 
     Something something = new Something(); 
     something.save(); 
     response.status = StatusCode.CREATED; // Doesn't work! 
     show(something.id); 
    } 

    public static void show(long id) { 
     render(Something.findById(id)); 
    } 
} 

method chaining in the Play! framework documentationも参照してください。

上記のコードは201 Createdの代わりに302 Foundというステータスコードを返します。 Playに正しいステータス(とLocationヘッダー)が返されるようにするにはどうすればよいですか?

答えて

6

これは、あなたが何かを作成したら、showアクションを呼び出すことで、遊びをShowに伝えているということです。

これを達成するには、リプレイを実行して(そのRESTfulな状態を維持する)、create()アクションを呼び出した結果、show()アクションにリダイレクトする必要があることをブラウザに伝えます。

だから、いくつかのオプションがあります。

  1. レスポンスをレンダリングしないでください。レスポンスをレンダリングしないでください。
  2. 代わりにショーを()を呼び出すのは、単にオプション2を使用するには... create()メソッドでそれを

を自分自身をレンダリングし、それは次のようになります。

public static void create() { 
    Something something = new Something(); 
    something.save(); 
    response.status = StatusCode.CREATED; 
    renderTemplate("Application/show.html", something); 
} 
+1

'201 Created'は、溶液2と起こりません' Location'ヘッダと一緒に送付されなければならないあなたが解決策1を説明してもらえ、私は理解していませんそれ? – deamon

+0

解決策1が良くありません。基本的には、リクエストを作成した後にshow()をリクエストすると、フローはサーバー側ではなくクライアント側(つまりjavascript)に決定されます。 – Codemwnci

+3

私はPlay(1.2.3)のソースコードとRedirectオブジェクトをチェックしましたが、コードはデフォルトで302になっています。別のコードを提供するコンストラクタがありますが、このコンストラクタはフレームワーク。 – Codemwnci

1

例コードPlayフレームワークでステータスコードを設定する場合: Response.current()。status = Http.StatusCode.CREATED;

0

再生フレームワークでは、別のアクションを呼び出すと、呼び出されたアクションがパブリックではないことを除いてリダイレクトが実行されます。 だから、ここソリューションの1つです:

public class SomeController extends Controller { 

    public static void create() { 
     Something something = new Something(); 
     something.save(); 
     response.status = StatusCode.CREATED; // Doesn't work! 
     show(something.id); 
    } 

    private static void show(long id) { 
     render(Something.findById(id)); 
    } 
} 
関連する問題