마사키군
960
2020-05-14 09:23:05
6
177

스프링 기반 웹에서, 요청 헤더를 VO로 받을 수 없나요?


안녕하세요. 제목 그대로의 질문인데, 음...

다들 아시다시피 스프링 웹에서 요청 URL과 매핑해둔 메서드에 @RequestParam 어노테이션이랑 같이 파라미터를 설정해두면 요청 파라미터를 모델로 받습니다. 기본 타입으로 선언하면 기본 타입으로 받고, VO 클래스로 설정하면 VO 클래스의 각 필드에 매핑해서 받아주죠.

혹은 @RequestParam 어노테이션이랑 @RequestBody 어노테이션을 같이 적용하면, HTTP 요청 바디에 있는 JSON을 VO로 매핑해주기도 하지요.

비슷하게, 요청 헤더를 VO로 받을 수 있는 방법이 없을까요? 그냥 간단히 RequestParam 어노테이션 쓰듯이 @RequestHeader RequestHeader header 식으로 선언하면 될 줄 알았는데, header가 null로 전달되더라구요-_- 이것때문에 어제 하루종일 인터넷을 검색해봤는데, Map으로 받을 수는 있지만 VO로 받을 수 있는 방법은 보질 못했네요.

이걸 Map으로 안받고 굳이 VO로 받으려는 이유는, 요청 헤더 VO에 Java Bean Validation을 설정해서 헤더로 받는 데이터에 유효성 검증을 하려고 해서요. 물론 인터셉터를 만들어서 그쪽에서 검증해도 되겠지만 관리해야 할 부분만 더 늘어난다는 느낌이 들고, 만약 API라도 하나 새로 만들어서 같은 내용이 적용되야 한다고 하면 인터셉터를 적용할 Path도 또 설정해줘야 하니까요.

0
0
  • 답변 6

  • itslike
    27
    2020-05-14 10:18:57
    HttpClient httpClient = new DefaultHttpClient();
    List<NameValuePair> param = new ArrayList<NameValuePair>();
    HttpGet httpGet = new HttpGet(요청url + URLEncodeUtils.format(param, "UTF-8"));

    httpGet.setHeader(.....)

    HttpResponse httpResponse = HttpClient.execute(httpGet);
    HttpEntity hpe = httpResponse.getEntity();

    String line;

    InputStream is = hpe.getContent();
    BufferedReader br = BufferedReader(new InputStreamReader(is, "UTF-8"));
    StringBuffer bf = new StringBuffer();
    while((line = br.readLine()) != null){
            bf.append(line.trim());
    }
    br.close();

    String strRes= bf.toString();

    JSONObject resObj = new JSONObject(strRes);
    JSONObject data = null;

    if(HttpResponse.getStatusLine().getStatusCode()  == 200){ //성공시에만 수신
    data = (JSONObject) resObj.get("data");
    }

    //vo set
    pojovo.getparam(data.getString("param"));

    도움이 되시길 바랍니다
    0
  • 미주엘
    316
    2020-05-14 11:07:49

    @InitBinder를 이용하여 직접 구현하시면 될 거 같습니다.

    0
  • 포포핀
    640
    2020-05-14 11:13:03 작성 2020-05-14 11:14:31 수정됨

    1. HeaderVo 를 만듭니다.

    class HeaderVo {
    
      private Mediatype ContentType;
      private long expires;
      .....
    
      ...getter, setter
    }

    2. @ModelAttribute를 정의합니다.

            @ModelAttribute("reqHeader")
    	public HeaderVo mapping(@RequestHeader HttpHeaders headers, HeaderVo headerVo) {
    		headerVo.setContentType(headers.getContentType());
                    ........
                    ........
    	    return headerVo;
    	}

    3. 컨트롤러에서 사용

        @GetMapping("/hello")
        public String userForm(User user, @ModelAttribute HeaderVo reqHeader) {		
    }


    0
  • 마사키군
    960
    2020-05-14 16:07:34

    @포포핀 )

    답변 고맙습니다.

    사실 어제 스택오버플로에서 똑같은 답변을 봤는데요, @ModelAttribute 정의를 어디에 해야 할지 모르겠더라구요.

    일단 HeaderVO에 @ModelAttribute 를 정의해봤는데, headerVO가 넘어올 때 null로 넘어오던데 혹시 @ModelAttribute 정의하는 다른 위치가 있나요?

    0
  • 포포핀
    640
    2020-05-14 16:11:25

    컨트롤러에 하시면됩니다

    0
  • 마사키군
    960
    2020-05-14 16:14:18
    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.