Nếu /user/5?v=html
và /user/5?v=json
trở lại hai cơ quan đại diện của tài nguyên tương tự, họ sẽ có cùng một URL, ví dụ /user/5
, theo số REST principles.
Ở phía máy khách, bạn có thể sử dụng tiêu đề Accept
trong các yêu cầu của mình để cho biết bạn muốn máy chủ gửi đại diện nào.
Về phía server, bạn có thể viết như sau với Play 2.1 để kiểm tra giá trị của Accept
tiêu đề:
public static Result user(Long id) {
User user = User.find.byId(id);
if (user == null) {
return notFound();
}
if (request().accepts("text/html")) {
return ok(views.html.user(user));
} else if (request().accepts("application/json")) {
return ok(Json.toJson(user));
} else {
return badRequest();
}
}
Lưu ý rằng các thử nghiệm đối với "text/html"
nên luôn luôn được viết trước khi bất kỳ loại nội dung khác bởi vì trình duyệt đặt tiêu đề Accept
yêu cầu của họ thành */*
khớp với tất cả các loại.
Nếu bạn không muốn viết if (request().accepts(…))
trong mỗi hành động, bạn có thể xác định yếu tố đó, ví dụ: như sau:
public static Result user(Long id) {
User user = User.find.byId(id);
return representation(user, views.html.user.ref);
}
public static Result users() {
List<User> users = User.find.all();
return representation(users, views.html.users.ref);
}
private <T> Result representation(T resource, Template1<T, Html> html) {
if (resource == null) {
return notFound();
}
if (request().accepts("text/html")) {
return ok(html.apply(resource));
} else if (request().accepts("application/json")) {
return ok(Json.toJson(resource));
} else {
return badRequest();
}
}
Nguồn
2012-05-21 13:04:56
ok, tôi nghĩ mình sẽ thích cái này hơn. Nhưng làm thế nào về ràng buộc đối tượng Java dựa trên HTML Form hoặc JSON Object (từ yêu cầu), tôi cũng sẽ cần phải thực hiện chúng với một tuyên bố if/else? Hoặc sẽ 'bindFromRequest' phục vụ cả hai? – adis
'bindFromRequest' sử dụng chuỗi truy vấn và phần thân yêu cầu (có thể là JSON, dạng url được mã hóa, v.v.). –