2012-05-20 25 views
11

tốt hoặc cách thích hợp để hiển thị đầu ra trong Khung chơi tùy thuộc vào thông số không? Ví dụ:Render định dạng đầu ra (HTML, JSON, XML) tùy thuộc vào tham số?

Đối với HTML:

http://localhost:9000/user/get/5?v=HTML // should render HTML template 

Đối với JSON:

http://localhost:9000/user/get/5?v=JSON // should render JSON template 

Tôi nghĩ rằng một đánh chặn yêu cầu có thể có khả năng để đạt được điều này, nhưng tôi không có đầu mối như thế nào để bắt đầu hoặc bắt đầu từ đâu :-(

Hoặc có thể, viết chung render method mà đọc các tham số và đầu ra theo yêu cầu, nhưng điều này có vẻ như tôi như overkill?

Trả lời

20

Nếu /user/5?v=html/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(); 
    } 
} 
+0

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

+0

'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.). –

2

Viết 2 phương pháp, sử dụng 2 tuyến đường (như bạn không chỉ định tôi sẽ sử dụng mẫu Java:

public static Result userAsHtml(Long id) { 
    return ok(someView.render(User.find.byId(id))); 
} 

public static Result userAsJson(Long id) { 
    return play.libs.Json.toJson(User.find.byId(id)); 
} 

tuyến:

/GET /user/get/:id/html  controllers.YourController.userAsHtml(id:Long) 
/GET /user/get/:id/json  controllers.YourController.userAsJson(id:Long) 

tiếp theo bạn chỉ có thể tạo một liên kết trong quan điểm khác để hiển thị dữ liệu của người dùng

<a href="@routes.YourController.userAsHtml(user.id)">Show details</a> 
<a href="@routes.YourController.userAsJson(user.id)">Get JSON</a> 

hoặc cái gì khác ...

chỉnh sửa # 1

bạn cũng có thể sử dụng chung if hoặc case để xác định kết quả cuối cùng

public static Result userAsV() { 
    String vType = form().bindFromRequest().get("v"); 

    if (vTtype.equals("HTML")){ 
     return ok(someView.render(User.find.byId(id))); 
    } 

    return play.libs.Json.toJson(User.find.byId(id)); 
} 
+0

Điều này có thể làm việc, nhưng sao chép những thứ sẽ không là sự lựa chọn đầu tiên của tôi. Tôi không có trường hợp sử dụng trực tiếp cho việc này, nhưng trong tương lai nếu tôi muốn tạo một ứng dụng di động gốc, tôi muốn thực hiện reqeust để chỉ truy xuất JSON ... – adis

+0

Vâng, như bạn muốn, hãy kiểm tra ** chỉnh sửa # 1 * * – biesior

0

Tôi muốn người dùng có thể xem trong trình duyệt dưới dạng html hoặc như json để phương thức chấp nhận không hoạt động đối với tôi.

Tôi giải quyết nó bằng cách đặt một renderMethod chung trong một lớp cơ sở với cú pháp phong cách sau đây

public static Result requestType() 
{ 
    if(request().uri().indexOf("json") != -1) 
    { 
     return ok(Json.toJson(request())); 
    } 
    else 
    { 
     return ok("Got HTML request " + request()); 
    } 
} 
Các vấn đề liên quan