利用MVC(4):HTTPリクエストの第3部-メディアタイプのマッピング


4.HTTPリクエストのマッピング3部-メディアタイプ


特定のタイプのデータを含む要求のみを処理するプロセッサ
  • @RequestMapping(consumes=MediaType.APPLICATION_JSON_UTF8_VALUE)
  • コンテンツタイプヘッダフィルタ
  • に一致しない場合、415はメディアタイプ応答
  • をサポートしない.
    既存のコード
    @Controller
    public class SampleController {
    
        @RequestMapping("/hello")
        @ResponseBody
        public String hello(){
            return "hello";
        }
    }
    @RunWith(SpringRunner.class)
    @WebMvcTest
    public class SampleControllerTest {
    
        @Autowired
        MockMvc mockMvc;
    	
        @Test
        public void helloTest() throws Exception{
            mockMvc.perform(get("/hello"))
                   .andDo(print())
                   .andExpect(status().isOk());
                
        }
    }
    プロセッサがjsonを送信する場合にのみ、リクエストを処理します.
    @Controller
    public class SampleController {
    
    //    @RequestMapping(value = "/hello", consumes = "applications/json")
      @RequestMapping(value="/hello", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
        @ResponseBody
        public String hello(){
            return "hello";
        }
    }
    文字列として入力するとエラーが発生しやすいので、文字列を入力しない場合はMediaTypeを使用して定数(IDE)を自動的に完了できます.
    Content-Type Headerは、要求本文がどのようなフォーマットのデータであるかを教えてくれます.
    テストコード
    @RunWith(SpringRunner.class)
    @WebMvcTest
    public class SampleControllerTest {
    
        @Autowired
        MockMvc mockMvc;
    	
        @Test
        public void helloTest() throws Exception{
            mockMvc.perform(get("/hello")
                   .contentType(MediaType.APPLICATION_JSON_UTF8))
                   .andDo(print())
                   .andExpect(status().isOk());
        }
    }
    特定のタイプのレスポンスを生成するハンドル
  • @RequestMapping(produces=”application/json”)
  • を使用してヘッダーフィルタリングを受け入れます(ただし、少し...奥義:ヘッダーを受け入れない場合は、任意の内容を受け入れます)
  • が一致しない場合406 Notは応答
  • を受け入れることができる.
    要求を送信する側は、受信ヘッダを設定することができる.
    @RunWith(SpringRunner.class)
    @WebMvcTest
    public class SampleControllerTest {
    
        @Autowired
        MockMvc mockMvc;
    	
        @Test
        public void helloTest() throws Exception{
            mockMvc.perform(get("/hello")
                   .contentType(MediaType.APPLICATION_JSON_UTF8)
                   .accept(MediaType.APPLICATION_JSON_UTF8))
                   .andDo(print())
                   .andExpect(status().isOk());
        }
    }
    純粋なテキストを生成することを明示した場合、テストは失敗します.
    @Controller
    public class SampleController {
    
        @RequestMapping(value="/hello", 
      		consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, 
      		produces = MediaType.TEXT_PLAIN)
        @ResponseBody
        public String hello(){
            return "hello";
        }
    }
    クラスに宣言された@Request Mappingと組み合わせるのではなく、メソッドの@Request Mapping設定で上書きします.
    @Controller
    @RequestMapping(consumes = MediaType.APPLICATION_XML_VALUE)
    public class SampleController {
    
        @RequestMapping(value="/hello", 
      		consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, 
      		produces = MediaType.TEXT_PLAIN)
        @ResponseBody
        public String hello(){
            return "hello";
        }
    }
    URL値とは異なり、メソッドはクラスの設定を上書きし、相互に組み合わせた関係ではありません.したがって、クラスの設定は適用されず、メソッドの設定のみが適用されます.
    Not (!)非特定のメディアタイプにマッピングすることもできます.
    リファレンス
  • インフラストラクチャ:SpringWeb MVC(白旗船)