Làm cách nào để có quyền truy cập vào thông tin tiêu đề HTTP trong bộ điều khiển Spring MVC REST?


154

Tôi chưa quen với lập trình web nói chung, đặc biệt là Java, vì vậy tôi mới biết tiêu đề và phần thân là gì.

Tôi đang viết các dịch vụ RESTful bằng Spring MVC. Tôi có thể tạo các dịch vụ đơn giản với @RequestMappingbộ điều khiển của mình. Tôi cần trợ giúp để hiểu cách nhận thông tin tiêu đề HTTP từ một yêu cầu đến phương thức của tôi trong bộ điều khiển dịch vụ REST. Tôi muốn phân tích ra tiêu đề và nhận được một số thuộc tính từ nó.

Bạn có thể giải thích làm thế nào tôi nhận được thông tin đó?

Câu trả lời:


263

Khi bạn chú thích một tham số với @RequestHeader, tham số sẽ lấy thông tin tiêu đề. Vì vậy, bạn có thể làm điều gì đó như thế này:

@RequestHeader("Accept")

để có được Accepttiêu đề.

Vì vậy, từ các tài liệu :

@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
                              @RequestHeader("Keep-Alive") long keepAlive)  {

}

Các giá trị Accept-EncodingKeep-Alivetiêu đề được cung cấp trong encodingkeepAlivecác tham số tương ứng.

Và không phải lo lắng. Chúng tôi là tất cả các noobs với một cái gì đó.


Cảm ơn bạn. Trong một số ví dụ mã trong công ty tôi làm việc, tôi thấy httpServletRequest là tham số và có một phương thức getHeader trên đó. Cách tiếp cận nào là thích hợp hơn?
Tiếng ngựa

1
Thích trừu tượng hóa với các chi tiết cấp thấp của API. Tôi muốn thay thế Spring MVC trừu tượng hóa các chi tiết của ServletAPI. Tôi có thể sử dụng các chú thích để lấy những gì tôi cần ra khỏi yêu cầu.
Vidya

6
Nếu được đề cập, bạn sẽ nhận được 400 lỗi yêu cầu xấu dưới dạng phản hồi trong trường hợp nếu yêu cầu không chứa tiêu đề đó. Cách linh hoạt hơn là truy cập trực tiếp vào các tiêu đề yêu cầu như được mô tả trong: stackoverflow.com/a/28209710/1828296
lospejos

Tôi đoán nó phụ thuộc vào những gì bạn muốn làm, nhưng phản hồi 400 là hành vi tôi hầu như luôn muốn trong trường hợp đó.
Vidya

@lospejos có thể tránh được bằng cách sử dụng requiredcờ như thế @RequestHeader(name = "Keep-Alive", required = false) long keepAlivesẽ đặt keepAlive thành null nếu không được cung cấp. Ngoài ra còn có defaultValuetrường cho các chú thích docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/ phỏng
Niccolò

88

Bạn có thể sử dụng @RequestHeaderchú thích với HttpHeaderstham số phương thức để có quyền truy cập vào tất cả các tiêu đề yêu cầu:

@RequestMapping(value = "/restURL")
public String serveRest(@RequestBody String body, @RequestHeader HttpHeaders headers) {
    // Use headers to get the information about all the request headers
    long contentLength = headers.getContentLength();
    // ...
    StreamSource source = new StreamSource(new StringReader(body));
    YourObject obj = (YourObject) jaxb2Mashaller.unmarshal(source);
    // ...
}

Điều gì về cơ thể của yêu cầu http? Làm thế nào để tôi truy cập các chi tiết cụ thể tiêu đề? bạn có thể giải thích cho tôi nếu httpHeaders là bản đồ mà tôi cần chìa khóa để truy cập không?
Tiếng ngựa

HttpHeaders có getters để có được các chi tiết cụ thể tiêu đề. bạn có thể khám phá liên kết này để có được thông tin chi tiết: docs.spring.io/spring/docs/3.1.x/javadoc-api/org/ Kẻ
Debojit Saikia

chỉnh sửa câu trả lời của tôi để cho thấy cách bạn có thể truy cập vào phần yêu cầu.
Debojit Saikia

1
Tại sao streamource cần thiết? Có vẻ như quá phức tạp. Phải có một cách dễ dàng hơn là sử dụng các luồng, v.v.
Horse Voice

Ở đây StringReaderđược sử dụng để đọc luồng ký tự đến. StreamSourcehoạt động như một chủ sở hữu cho một nguồn chuyển đổi dưới dạng một luồng đánh dấu XML.
Debojit Saikia

14

Giải pháp của tôi trong các tham số Header với ví dụ là user = "test" là:

@RequestMapping(value = "/restURL")
  public String serveRest(@RequestBody String body, @RequestHeader HttpHeaders headers){

System.out.println(headers.get("user"));
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.