Spring MVC REST denetleyicisinde HTTP üstbilgisi bilgilerine nasıl erişilir?


154

Genel olarak web programlamasında, özellikle Java'da yeniyim, bu yüzden bir başlık ve gövdenin ne olduğunu öğrendim.

Spring MVC kullanarak RESTful hizmetleri yazıyorum. @RequestMappingDenetleyicilerimde basit hizmetler oluşturabiliyorum . REST hizmet denetleyicimde yöntemime gelen bir istekten HTTP üstbilgisi bilgilerinin nasıl alınacağını anlama konusunda yardıma ihtiyacım var. Başlığı ayrıştırmak ve ondan bazı özellikler almak istiyorum.

Bu bilgiyi nasıl elde ettiğimi açıklayabilir misiniz?

Yanıtlar:


264

Bir parametreye ek açıklama eklediğinizde @RequestHeader, parametre başlık bilgisini alır. Böylece sadece böyle bir şey yapabilirsiniz:

@RequestHeader("Accept")

Acceptbaşlığı almak için .

Yani dokümantasyondan :

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

}

Accept-EncodingVe Keep-Alivebaşlık değerleri verilmiştir encodingve keepAlivesırasıyla parametreleri.

Ve endişelenme. Hepimiz bir şeyle beraberiz.


Teşekkür ederim. Çalıştığım şirketteki bazı kod örneklerinde, HttpServletRequest parametresi olarak görüyorum ve üzerinde bir getHeader yöntemi var. Hangi yaklaşım tercih edilir?
At Sesi

1
Bir API'nın düşük düzeyli ayrıntılarında soyutlamaları tercih edin. Ben daha çok Bahar MVC ServletAPI ayrıntılarını soyut olurdu . Ek açıklamaları, ihtiyacım olanı istek dışında çekmek için kullanabilirim.
Vidya

6
Şunu belirtmeliyim ki, istek böyle bir başlık içermiyorsa yanıt olarak 400 hatalı istek hatası alırsınız. : Anlatıldığı gibi daha esnek bir yoludur istek başlıklarına doğrudan erişim olduğunu stackoverflow.com/a/28209710/1828296
lospejos

Sanırım ne yapmak istediğinize bağlı, ancak 400 yanıt, bu durumda neredeyse her zaman isteyeceğim davranıştır.
Vidya

@lospejos böyle bir requiredbayrak kullanılarak önlenebilecek @RequestHeader(name = "Keep-Alive", required = false) long keepAlivekeepAlive belirtilmemişse null değerine ayarlanır. Ayrıca, docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/…defaultValue
Niccolò

88

Tüm istek başlıklarına erişim elde etmek için @RequestHeaderek açıklamayı HttpHeadersmethod parametresiyle kullanabilirsiniz:

@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);
    // ...
}

Http isteğinin gövdesi ne olacak? Başlık özelliklerine nasıl erişirim? HttpHeaders'ın erişmek için bir anahtara ihtiyacım olan bir harita olup olmadığını bana açıklayabilir misiniz?
At Sesi

HttpHeaders başlık özelliklerini almak için alıcılara sahiptir. ayrıntıları almak için bu bağlantıyı keşfedebilirsiniz: docs.spring.io/spring/docs/3.1.x/javadoc-api/org/…
Debojit Saikia

cevabımı, istek gövdesine nasıl erişebileceğinizi göstermek için düzenledi.
Debojit Saikia

1
Akış kaynağı neden gereklidir? Çok karmaşık görünüyor. Akarsu vb
Horse Voice

Burada StringReadergelen karakter akışını okumak için kullanılır. StreamSourceXML biçimlendirme akışı biçiminde bir dönüşüm kaynağı için tutucu olarak çalışır.
Debojit Saikia

14

Üstbilgi parametrelerinde örnek ile benim çözüm kullanıcı = "test" dir:

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

System.out.println(headers.get("user"));
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.