5

Tôi có một hành động create trong Play! bộ điều khiển khung phải trả về mã trạng thái HTTP Created và chuyển hướng máy khách đến vị trí của đối tượng đã tạo.Trạng thái HTTP trả lại "đã tạo" trong Play! Khung

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)); 
    } 
} 

Xem thêm method chaining in the Play! framework documentation.

Đoạn mã trên trả về mã trạng thái 302 Found thay vì 201 Created. Tôi có thể làm gì để cho phép Play trả lại trạng thái chính xác (và tiêu đề Location)?

Trả lời

6

Lý do điều này xảy ra, là khi bạn đã tạo ra thứ gì đó của mình, bạn sau đó sẽ phát cho Show thứ gì đó của bạn, thông qua gọi hành động show. Để đạt được điều này, chơi đang thực hiện chuyển hướng (để duy trì trạng thái RESTful) của nó, để báo cho trình duyệt biết kết quả của việc gọi hành động create(), bây giờ nó phải chuyển hướng đến hành động show().

Vì vậy, bạn có một vài tùy chọn.

  1. Không trả lời và để phía khách hàng xử lý vị trí của nó sau khi tạo nó (không lý tưởng).
  2. Thay vì gọi show(), chỉ cần làm cho nó chính mình trong phương pháp tạo() ...

Để sử dụng phương án 2, nó có thể trông giống như sau: Mã

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

'201 Created' nên được gửi cùng với một 'tiêu đề Location' đó sẽ không xảy ra với dung dịch 2. Ông có thể vui lòng giải thích giải pháp 1, tôi không hiểu nó? – deamon

+0

Giải pháp 1 không tốt. Về cơ bản nó nói rằng, sau khi yêu cầu của bạn tạo ra, sau đó yêu cầu hiển thị(), do đó luồng của bạn được quyết định phía máy khách (tức là javascript), chứ không phải là các tác vụ trong hành động của bạn. – Codemwnci

+3

Tôi đã kiểm tra mã nguồn cho Play (1.2.3) và đối tượng Redirect, có mã, được mặc định là 302. Nó có một hàm tạo để cung cấp một mã khác, nhưng hàm tạo này dường như không được sử dụng trong khuôn khổ. – Codemwnci

1

Ví dụ để đặt mã trạng thái trong khung chơi: Response.current(). status = Http.StatusCode.CREATED;

0

Trong khung chơi, gọi hành động khác thực hiện chuyển hướng ngoại trừ hành động được gọi là không công khai. Vì vậy, đây là một trong những giải pháp:

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)); 
    } 
}