I have a create
action in a Play! framework controller that should return the HTTP status code Created
and redirect the client to the location of the created object.
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));
}
}
See also method chaining in the Play! framework documentation.
The code above returns the status code 302 Found
instead of 201 Created
. What can I do to let Play return the correct status (and Location
header)?
The reason this is happening, is that once you created your something, you are then telling play to Show
your something, through calling the show
action.
To achieve this, play is performing a redirect (to maintain its RESTful state), to tell the browser that as a result of calling the create()
action, it must now redirect to the show()
action.
So, you have a couple of options.
To use option 2, it may look like the following:
public static void create() {
Something something = new Something();
something.save();
response.status = StatusCode.CREATED;
renderTemplate("Application/show.html", something);
}