eotpan
1k
2019-02-22 10:40:22
9
278

httpClient response 한글이 깨지는데 도무지 이유를 모르겠습니다 ㅠㅠ




서버는 스프링 기반이고


@RequestMapping(value = "test.do")

public ResponseEntity<String> testAjax() throws Exception {


    HttpHeaders resHeaders = new HttpHeaders();

    resHeaders.add("Content-Type", "application/json;charset=UTF-8");

 

    String jsonResult = "{\"name\": \"홍길동\",\"age\": 21}" ;

     

    return new ResponseEntity<String>(jsonResult, resHeaders, HttpStatus.CREATED) ;

}



스프링 버전이 낮아서 대충 위처럼 되어있고요





클라이언트는 httpClient로 호출합니다


ResponseHandler<String> responseHandler = new BasicResponseHandler();

String responseBody = httpclient.execute(httpget, responseHandler);


위처럼 받아오면 responseBody 찍어보면 한글이 ??? 로 나오네요


파라미터 셋팅해서 위 서버로 보낼때는 한글 안깨집니다 서버에서 처리후


response 에서는 무조건 한글이 ? 로 나옵니다



위 방법 말고 다른방법으로 호출도 해봤는데 


예를들어



HttpResponse res = httpclient.execute(httpget, responseHandler);


위처럼 받아서 res를 버퍼드리더로 읽어도 한글이 깨짐니다


그래서  HttpEntity 를 찍어봤더니


HttpEntity ent = res.getEntity();


ent.getContentType() <- 이부분을 찍었을때 "Content-Type: text/plain;charset=ISO-8859-1


로 찍힙니다..


혹시 몰라서 res 받자말자 res.setHeader 을 해줘도 엔티티 찍어보면 ISO-8859-1 이네요;;



분명히 서버에서는 UTF-8로 헤더 셋팅해서 보내주거든요 


클라이언트를 위 2가지 방식 말고 스프링에 있는 restTemplit 으로 호출해도 똑같이 한글이 ??? 로 나옵니다.





정리하면


1. 클라->서버 로 post 보낼때 파라미터한글은 깨지지 않음


2. 서버에서 utf-8로 인코딩해서 보냄에도 불구하고

   클라이언트에서 찍어보면 ISO-8895-1 로 찍힘.


3. 여러방법 으로 HTTPCLIENT GET방식 POST방식, RESTTEMPLIT , 자바.NET기본제공 방식으로도 

   호출해보았으나 한글깨짐





이게 서버 문제인지 클라문제인지도 잘 모르겠습니다 ㅠㅠ


클라문제 같긴한데 여러방법다 해봤는데 안되는거 보면 서버문제인거 같기도해서요.


도움 및 조언 부탁 드립니다. 감사합니다..



0
0
  • 답변 9

  • 아이러니y
    1k
    2019-02-22 10:50:55

    헤더에 contentType을 설정해보심이


    headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));

    0
  • eotpan
    1k
    2019-02-22 10:56:28

    아이러니 /  댓글감사합니다

    그렇게 해보았으나.. 동일하네요

    클라에서 RESPONSE 받자말자 response.getAllHeaders()  로 헤더 다 찍어봐도

    iso-8859-1 이 나오네요 미치겠네용 ㅠㅠ .. 머가 문제인지 ..


    구글에 httpclient 한글깨짐으로 검색하서 나온 방법은 다 해본거같은데 ㅎㅎ ㅠㅠ


    0
  • 임뫜
    705
    2019-02-22 11:07:57

    CloseableHttpResponse httpResponse = httpClient.execute(httpGet);        

    String json = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");

    0
  • eotpan
    1k
    2019-02-22 11:15:17

    임뫜 / 댓글 감사합니다

    구글 검색해서 해본 방법중 하나 입니다 역시 안되네요 ㅠㅠ

    0
  • 임뫜
    705
    2019-02-22 11:31:07 작성 2019-02-22 11:33:57 수정됨

    혹시 서버에서 리턴 전에 찍어보셔도 ???로 뜨나요


    서버단에서 하는 비슷한 형태가 있는데 제가 가진 소스중에

    @RequestMapping(value="test.do", method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<String> test() throws Exception{
    	ResponseEntity<String> entity = null;
    	try{
    		String jsonStr = "[]";
    		ArrayList<VO객체> dataList = new ArrayList<VO객체>;
    
    		dataList = service.dao();
    		jsonStr = new Gson().toJson(dataList);
    HttpHeaders resHeader = new HttpHeaders(); resHeader.add("Content-Type", "application/json;charset=UTF-8"); entity = new ResponseEntity<String>(jsonStr, resHeader, HttpStatus.CREATED); }catch(Exception e){ } return entity; }

    0
  • eotpan
    1k
    2019-02-22 11:39:38

    임뫜 / 조언감사드립니다.

    서버 에서 리턴전에 sysout 찍으면... UTF-8 잘 나옵니다 

    resHeader.getContentType() ---> UTF-8 잘나옵니다 ㅠㅠ 

    클라에 가는순간.. 무조건 ISO-8859가 되버리네요

    httpClient 최신버전 올려서 했는데도 안되네요 ㅠㅠ

    받자말자 리스폰스 헤더가 iso-8859로 변경되 버려요


    0
  • eotpan
    1k
    2019-02-22 11:59:16

    흠 이거 스프링 서버 문제 인듯하네요

    클라는 고대로 두고


    간단하게... JAVA로만 웹서버 만들어서 리스폰스 UTF-8로 리턴해주니.. 잘됩니다

    스프링 리스폰스 바디 쪽에서 뭔가 문제가 있는거같아요 ㅠㅠ

    스프링 버전이 너무 낮아 그런거같기도하고 .. 댓글주신 분들 감사드려요

    서버버전을 올리덩가 해야겠네요 

    0
  • ansdbduf
    788
    2019-02-22 12:00:54

    https://stove99.tistory.com/151

    0
  • eotpan
    1k
    2019-02-22 12:10:46

    ansdbduf // 감사합니다. 주신 방법으로 해결했습니다 ^^


    서버문제인줄 진작에 알았으면 좋았을껄 서버에는 문제가 없다는 맹신땜에 ㅠㅠ

    클라만 계속 수정하고있었네요 ㅎㅎㅎ


    좋은하루되세요 !



    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.