Spring MVC RESTコントローラーでHTTPヘッダー情報にアクセスするにはどうすればよいですか?


154

私はWebプログラミング全般、特にJavaに慣れていないので、ヘッダーと本文が何であるかを学びました。

Spring MVCを使用してRESTfulサービスを作成しています。@RequestMappingコントローラでを使用して簡単なサービスを作成できます。RESTサービスコントローラーのメソッドに送信されるリクエストからHTTPヘッダー情報を取得する方法を理解するのに助けが必要です。ヘッダーを解析して、そこからいくつかの属性を取得したいと思います。

その情報を取得する方法について説明していただけますか?

回答:


264

でパラメータに注釈を付けると、パラメータ@RequestHeaderはヘッダー情報を取得します。したがって、次のようなことを実行できます。

@RequestHeader("Accept")

Acceptヘッダーを取得します。

だからドキュメントから:

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

}

Accept-EncodingそしてKeep-Aliveヘッダの値が設けられているencodingkeepAlive、それぞれのパラメータ。

そして、心配はありません。私たちは皆何かに慣れていない。


ありがとうございました。私が働いている会社のいくつかのコード例では、パラメーターとしてHttpServletRequestがあり、その上にgetHeaderメソッドがあります。どのアプローチが望ましいですか?
馬の声

1
APIの低レベルの詳細よりも抽象化を優先します。むしろ、Spring MVCにServletAPIの詳細を抽象化してもらいたいと思っています。アノテーションを使用して、リクエストから必要なものを引き出します。
Vidya 2013年

6
言及すべきですが、リクエストにそのようなヘッダーが含まれていない場合、レスポンスとして400 bad requestエラーが返されます。より柔軟な方法は、stackoverflow.com
a / 28209710/1828296

それはあなたが何をしたいかに依存すると思いますが、400応答は、私がその場合にたいていいつも望んでいる振る舞いです。
Vidya 2016年

このrequiredようなフラグを使用することで回避できる@RequestHeader(name = "Keep-Alive", required = false) long keepAlive@lospejosを指定しないと、keepAliveがnullに設定されます。ありdefaultValue、注釈のためのフィールドdocs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/...
ニコロ・

88

メソッドパラメータ@RequestHeader付きのアノテーションを使用して、HttpHeadersすべてのリクエストヘッダーにアクセスできます。

@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リクエストの本文はどうですか?ヘッダーの詳細にアクセスするにはどうすればよいですか?HttpHeadersがアクセスにキーが必要なマップであるかどうかを説明してもらえますか?
馬の声

HttpHeadersには、ヘッダーの詳細を取得するゲッターがあります。あなたは、詳細情報を取得するには、このリンクを探索することができます:docs.spring.io/spring/docs/3.1.x/javadoc-api/org/...
Debojit Saikia

私の回答を編集して、リクエストの本文にアクセスする方法を示しました。
Debojit Saikia 2013年

1
なぜストリームソースが必要なのですか?複雑すぎるようです。使用などをストリーミングするよりも、もっと簡単な方法があるに違いありません
馬の声

ここStringReaderは、着信文字ストリームを読み取るために使用されます。StreamSourceXMLマークアップのストリームの形式で変換ソースのホルダーとして機能します。
Debojit Saikia 2013年

14

ヘッダーパラメータの例はuser = "test"ですが、次のとおりです。

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

System.out.println(headers.get("user"));
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.