2012-12-31 43 views
14

Tôi đang sử dụng khung làm việc để phát triển dịch vụ web RESTful. Tôi ném mã trạng thái HTTP khác nhau với phản ứng sử dụng đoạn mã sau:cách ném mã trạng thái HTTP 204 bằng cách sử dụng khung công tác trong dịch vụ web RESTful?

public class RestNoContentException extends WebApplicationException 
{ 
    public RestNoContentException(String message) 
    { 
     super(Response.status(Status.NO_CONTENT) 
      .entity(message).type("text/plain") 
      .build()); 
     } 
} 

Trong khi thử nghiệm các dịch vụ web REST sử dụng Firefox Mozilla nghỉ ngơi khách hàng công cụ, nó được hiển thị 200 OK tình trạng thay vì 204 NO CONTENT. Tôi đang xử lý các mã trạng thái khác giống như cách tôi đang thực hiện đối với mã trạng thái 204. Các mã trạng thái khác xuất hiện đúng trên công cụ khách hàng còn lại nhưng khi hiển thị mã trạng thái 204, mã này đang hiển thị mã trạng thái 200 OK.

Ai đó có thể giúp tôi ở đây không? tôi đang thiếu gì?

Trả lời

11

Bạn không nên cung cấp cho tổ chức nếu bạn muốn ném 204:

@GET 
@Produces(MediaType.TEXT_PLAIN) 
public Response test() { 
    //return Response.status(Status.NO_CONTENT).entity("hello").build(); //this will throw 200 
    return Response.status(Status.NO_CONTENT).build(); 
} 
18

Thứ nhất, 204 là trong thể loại "thành công" của mã đáp ứng, vì vậy trở về nó như là kết quả của một ngoại lệ là một rất, điều kỳ lạ để làm.

Thứ hai, 204 có nghĩa là "Không có nội dung", có nghĩa là phản hồi không chứa thực thể, nhưng bạn đặt một trong đó. Có khả năng Jersey sẽ chuyển nó thành 200 cho bạn, về cơ bản giống với 204, ngoại trừ việc nó chứa một thực thể phản hồi.

Cuối cùng, bạn có thể nhận được 204 câu trả lời rất đơn giản bằng một vài hành vi được tích hợp sẵn: các phương thức void và giá trị trả về null cả hai ánh xạ tới phản hồi 204. Nếu không, chỉ cần trả lại Response.status(204).build().

8

Chỉ một điều để thêm vào các câu trả lời đã có. Có gì Jersey đang làm là correct behavior as for the spec:

3.3.3 Loại Return

phương pháp Resource THỂ trả về void, đáp ứng, GenericEntity, hoặc một loại Java, các loại trở lại được ánh xạ tới một cơ thể thực thể phản ứng như sau:

void Kết quả trong một thực thể trống có mã trạng thái 204.

Trả lời Kết quả trong một thực thể được ánh xạ từ thuộc tính thực thể của Phản hồi với mã trạng thái được chỉ định bởi thuộc tính trạng thái của Phản hồi. Giá trị trả về null trả về mã trạng thái 204. Nếu thuộc tính trạng thái của Phản hồi không được đặt: mã trạng thái 200 được sử dụng cho thuộc tính thực thể không null và mã trạng thái 204 được sử dụng nếu thuộc tính entity là null.

GenericEntity Kết quả trong một thực thể được ánh xạ từ thuộc tính Entity của GenericEntity. Nếu giá trị trả về không phải là null, mã trạng thái 200 được sử dụng, giá trị trả lại null sẽ dẫn đến mã trạng thái 204.

Khác Kết quả trong một thực thể được ánh xạ từ lớp của thể hiện được trả về. Nếu giá trị trả về không phải là null, mã trạng thái 200 được sử dụng, giá trị trả lại null sẽ dẫn đến mã trạng thái 204.

[...]

Và kể từ khi bạn đang sử dụng một ngoại lệ, phần sau đây áp dụng (tôi nhấn mạnh):

3.3.4 Exceptions

Một phương pháp tài nguyên, phương pháp tiểu tài nguyên hoặc tiểu -Người định vị địa chỉ có thể ném bất kỳ kiểm tra hoặc bỏ chọn ngoại lệ. Triển khai PHẢI bắt tất cả ngoại lệ và xử lý các trường hợp ngoại lệ như sau:

  1. Trường hợp của WebApplicationException PHẢI được ánh xạ tới phản hồi như sau. Nếu thuộc tính phản hồi của ngoại lệ không chứa thực thể và nhà cung cấp bản đồ ngoại lệ (xem phần 4.4) khả dụng cho WebApplicationException, việc triển khai PHẢI sử dụng nhà cung cấp để tạo phiên bản Phản hồi mới, . . Ví dụ kết quả trả lời được xử lý theo mục 3.3.3.

[...]

Vì vậy, bạn nên hoặc là trả về null, khoảng trống hoặc xây dựng một phản ứng 204. Bạn chỉ ném ngoại lệ nếu đó là trường hợp ngoại lệ trong đơn đăng ký của bạn và ném ngoại lệ makes this clear.

+0

Xin chào các bạn, cảm ơn rất nhiều vì phản hồi của bạn. –

Các vấn đề liên quan