Spring Bootでは、@RequestMapping
を使用するとデフォルトでGETとHEADリクエストが同じメソッドで処理されます。これは通常便利ですが、HEADリクエストで特定の処理をスキップしたい場合には問題となることがあります。
あるエンドポイントに対して、GETリクエストは通常通り処理を行い、HEADリクエストの場合はボディを返さずに特定の処理をスキップしたいとします。しかし、Spring BootではGETとHEADリクエストが同じメソッドで処理されるため、HEADリクエストに対してもGETリクエストと同様の処理が行われてしまいます。
先に解決策
RequestMappingに method = RequestMethod.HEADを指定する
HEADリクエストとGETリクエストを別々のメソッドで処理することで、対応できます。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { // GETリクエストを処理するメソッド @RequestMapping(value = "/myEndpoint", method = RequestMethod.GET) public String handleGetRequest() { // GETリクエストの処理 } // HEADリクエストを処理するメソッド @RequestMapping(value = "/myEndpoint", method = RequestMethod.HEAD) public void handleHeadRequest() { // HEADリクエストの処理(何もしないまたは最小限の処理) } } |
じゃあねー。