2013-07-26 41 views
22

Tôi đang cố gắng đạt được những điều sau đây.Tiêu đề phản hồi tùy chỉnh Jersey/Java

Đọc một tiêu đề tùy chỉnh và giá trị của nó từ Yêu cầu:

name: username 

Bây giờ, trên phản ứng, tôi muốn quay trở lại cùng cặp tiêu đề name:value để đáp ứng HTTP.

Tôi đang sử dụng dịch vụ web JAX-RS Jersey 2.0.

Khi tôi gửi URL yêu cầu Http://localhost/test/, tiêu đề yêu cầu cũng được chuyển (hiện tại, mặc dù plugin Firefox - mã hóa chúng).

On nhận được yêu cầu cho URL đó, các phương pháp sau đây được gọi:

@GET 
@Produces(MediaType.APPLICATION_JSON) 
public UserClass getValues(@Context HttpHeaders header) { 
    MultivaluedMap<String, String> headerParams = header.getRequestHeaders(); 
    String userKey = "name"; 
    headerParams.get(userKey); 

    // ... 

    return user_object; 
} 

Làm thế nào tôi có thể đạt được điều này? Mọi gợi ý đều tuyệt!

Trả lời

30

Chỉ cần tiêm @Context HttpServletResponse response làm đối số phương thức. Thay đổi các tiêu đề trên đó

@Produces(MediaType.APPLICATION_JSON) 
public UserClass getValues(@Context HttpHeaders header, @Context HttpServletResponse response) { 
    response.setHeader("yourheadername", "yourheadervalue"); 
    ... 
} 
+1

Tôi có cần thêm các thư viện bổ sung không? nó nói lớp không xác định "HttpServletResponse". – Namenoobie

+0

@Namenoobie Bạn cần thư viện thời gian chạy máy chủ. Điều này về cơ bản là api servlet. Nếu bạn đang sử dụng Eclipse, hãy vào dự án xây dựng java của bạn và thêm thư viện. –

+0

Khi tôi làm theo hướng dẫn, tôi nhận được máy chủ Tomcat đã tồn tại trên máy cục bộ của tôi. – Namenoobie

2

Trả lại số Response (một lớp từ JAX-RS) với UserClass làm thực thể. Trên Response bạn có thể đặt tiêu đề HTTP.

+2

Tôi xin lỗi, tôi không làm theo. bạn có thể xây dựng được không? – Namenoobie

44

Tôi nghĩ sử dụng javax.ws.rs.core.Response là thanh lịch hơn và nó là một phần của Jersey. Chỉ để mở rộng câu trả lời trước, đây là một ví dụ đơn giản:

@GET 
    @Produces({ MediaType.APPLICATION_JSON }) 
    @Path("/values") 
    public Response getValues(String body) { 

     //Prepare your entity 

     Response response = Response.status(200). 
       entity(yourEntity). 
       header("yourHeaderName", "yourHeaderValue").build(); 

     return response; 
    } 
+4

Đây phải là câu trả lời đã chọn. – reinaldoluckman

+5

để làm cho nó thậm chí còn đơn giản hơn thay thế '.status (200) .entity' với' .ok'. –

+0

Điều này có thể gây ra sự cố với việc tạo tài liệu API tự động bằng [swagger codegen] (https://github.com/swagger-api/swagger-codegen). – koppor

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