Springリクエストマッピング


詳細は正式な書類に記載されていますが、必要に応じてよく読むことをお勧めします.
DispatcherServiceletの操作中、Request MappingHandlerという特殊なbeanが要求を処理するためにHandlerを検索します.
ここで、Handlerは、開発者が外部リクエストをどのように処理するかを説明します.
ユーザの要求がどのHandlerによって処理されるべきかを決定する方法は複数あります.
  • HTTP Method
  • URI Pattern
  • MediaType (by Content-Type, Accept Header)
  • ヘッダーがParameterと一致するかどうか
  • また,スプリングによって自動的に処理されるHEADOPTIONSの方法も紹介した.

    簡単なHandler定義とテスト

    @Controller
    public class EventController {
        // @RequestMapping("/hello", method=RequestMethod.GET)
        @GetMapping("/hello")
        @ResponseBody
        public String events() {
        	return "Hello";
        }
    }
    @ControllerにおいてHandlerを定義することにより、GET /events要求に対して適切なウェブページまたはデータを簡単に応答として提供することができる.

    Handler Test


    Springが提供するMockMvc beanを使用すると、Handlerを作成し、予想通りにテストできます.
    JUnit 5では、次のコードを使用してテストできます.@AutoConfigureMockMvcを適用して、MockMvcを空に注入することができる.
    @SpringBootTest
    @AutoConfigureMockMvc
    class HelloControllerTest {
        @Autowired
        MockMvc mockMvc;
    
        @Test
        public void test1() {
        	 mockMvc.perform(get("/hello")
                .andExpect(status().isOk())
                .andExpect(content().string("Hello"));
        }
    }
    MockMvcは、作成されたHandlerをテストするための要求を作成し、適切な応答が受信されたかどうか、適切なHeader値があるかどうかなど、様々なテストを行うことができる.
    MockMvcに慣れると、Handlerを簡単にテストできます.

    HTTPメソッドによるリクエストのマッピング


    要求されたHTTPメソッドに従ってHandlerをマッピングできます.
    前述したように、@RequestMappingを使用してHandlerを定義することができる.
    Springは複合Annotationを使用して簡潔なハンドルを定義し、@RequestMappingが拡張されたHTTPメソッド@GetMapping@PostMapping@PutMapping@DeleteMapping@DeleteMapping、および@PatchMapping Annotationに対応する.

    URIモードによる要求マッピング


    最も基本的なHandlerマッピングとURI文字列に基づいてマッピングされます.Springは、さまざまな文字列アレイマッピングを提供します.
  • /resources/ima?e.png - match one character in a path segment
  • /resources/*.png - match zero or more characters in a path segment
  • /resources/** - match multiple path segments
  • /projects/{project}/versions - match a path segment and capture it as a variable
  • /projects/{project:[a-z]+}/versions - match and capture a variable with a regex
  • @PathVariable

    @PathVariableの動作は、URIの値を変数として入力することを可能にする.
    @GetMapping("/owners/{ownerId}/pets/{petId}")
    public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
        // ...
    }
    pathの.../{owenerId}/...は、パラメータの名前(ownerId)と一致し、所望のタイプで得られる.また、@PathVariable("ownerId") Long idなどの明示的な名前でインポートすることもできます.

    MediaTypeによるリクエストのマッピング


    ハンドラをHTTPリクエストにマッピングする場合、主に使用するHTTPヘッダはContent-TypeAcceptである.
  • Content-Type
  • 要求されたデータ型を表すヘッダー.
  • Accept
  • 返信するデータ型を示すヘッダー.
    Spring MVCは、以下に示すように、要求されたクライアントがどのタイプのデータを送信するか、およびどのタイプの応答を受信するかを示すために、Handlerマッピングを使用することができる.
    @RequestMapping(value="/hello",
                consumes = MediaType.APPLICATION_JSON_VALUE,
                produces = MediaType.APPLICATION_JSON_VALUE)         
    属性値consumesは、受信したContent-Typeproducesに相当し、応答を表すAcceptヘッダ値に相当する.

    各MediaTypeはSpringのorg.springframework.httpパッケージを介して定数形式で提供される._VALUEは文字列を表します.

    テスト


    先ほど紹介したMockMvcを利用して、MediaTypeヘッダ値をテストすることもできます.
    mockMvc.perform(get("/hello")
    		.contentType(MediaType.APPLICATION_JSON)
        	.accept(MediaType.TEXT_PLAIN))
        	.andExpect(status().isOk());
    上記のようにcontentTypeとacceptを貼り付けて、リクエスト時に適切なプロセッサで処理されていることを確認できます.

    HeaderとParameterによるHandlerのマッピング

  • リーダー指定時は
  • 特定リーダの値が特定値である場合、
  • パラメータ指定時は
  • 特定パラメータの値が特定値の場合、
  • Handlerマッピングは上記の条件で処理してもよい.
    @GetMapping(path = "/pets/{petId}", params = "myParam=myValue") 
    public void findPet(@PathVariable String petId) {
        // ...
    }
    @GetMapping(path = "/pets", headers = "myHeader=myValue") 
    public void findPet(@PathVariable String petId) {
        // ...
    }

    Head, OPTIONS HTTP METHOD

    HEADメソッドのハンドルを定義すると、GET Httpメソッドは自動的にスプリングによって暗黙的に作成されます.HEADメソッドはGETプロセッサ処理の結果のHeaderのみを提供する.(Bodyデータ提供x)
    2479142 HTTPメソッドは、2479142言語宣言後に一致するURIモードを定義したHandlerメソッドおよびHTTPメソッドを2479142 Headerに送信する.これはCORSの処理に用いられるため非常に有用である.

    整理する


    Spring MVCにおける要求マッピングに関する概念を簡単に理解した.次に,要求マッピング後にHandlerが使用する様々なArcgumentタイプと,戻りタイプに関する機能を見てみる.