[질문] 사용자 정보 요청 api 호출 후 nickname 인코딩 문제

java spring으로 rest api 호출하여 사용중인 유저입니다.

사용자 정보 요청 api 호출 후 결과값을 받는데 nickname 인코딩 문제 때문에 에러가 납니다.


// 헤더값은 아래와 같이 설정

Map<String, String> headers = new HashMap<String, String>();
headers.put(“content-type”, “application/x-www-form-urlencoded;charset=utf-8”);
headers.put(“Authorization”, "Bearer " + accessToken);

// post 요청 후 응답 결과 데이터

{“id”:48407541,“properties”:{“nickname”:"媛꾩젙??,“thumbnail_image”:null,“profile_image”:null}}

가이드 대로 요청을 했다고 생각하는데… 이거 참…
인코딩이 깨지더라도 정확하게 쌍따옴표로 묶이기만 했어도 됬는데 이게 안되서 json convert 자체가 안되네요.

로컬 서버 인코딩이 잘못된건가요???

@hay6308 java에서 response를 받고 string을 구성하실 때, 한번 "UTF-8"로 구성해 보시겠어요?

예)

public String urlEncodeUTF8(String s) {
        try {
            return URLEncoder.encode(s, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new UnsupportedOperationException(e);
        }
    }

참고)
https://devtalk.kakao.com/t/java-rest-api/14543

@michael 님, 답변 감사드립니다.

결론부터 말씀드리자면 해결이 되진 않았습니다.

참고로 보내주신 링크는 이미 글 쓰기 전에 읽어보고, urlencoding 변환 시도도 해봤지만 해결되진 않았습니다.

tomcat 에 server.xml 에 uriencode=“utf-8” 적용하였고, 스프링 프로젝트 설정에서 filter에 utf-8로 설정해 두었습니다만… 그래도 한글이 깨지네요.

뭐가 잘못된건지 제가 하나하나 다시 파봐야 할 것 같네요.

1개의 좋아요

자답입니다. @michael 님, 혹여나… 저같이 대책없이 한글이 깨질 경우, 이렇게 해보시라고 알려주셔도 될 거 같네요.

InputStreamReader 객체를 이용하여 응답결과를 읽어들일 때, UTF-8 을 붙여 사용하였더니 안깨지고 정상적으로 들어오네요.

/**
 * POST 방식
 * @param url
 * @param header
 * @param params
 * @return
 * @throws ClientProtocolException
 * @throws IOException
 */
protected String getResponseBody(String url, Map<String, String> header, Map<String, String> params) {
    HttpClient client = HttpClientBuilder.create().build();
    HttpPost post = new HttpPost(url);
    
    // 1. 헤더값 설정
    if(header != null) {
        Iterator<String> it = header.keySet().iterator();
        while(it.hasNext()){
            String key = it.next();
            String val = header.get(key);
            post.addHeader(key, val);
        }
    }
    
    // 2. 파라미터값 설정
    if(params != null) {
        List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
        
        Iterator<String> itParam = params.keySet().iterator();
        while(itParam.hasNext()){
            String key = itParam.next();
            String val = params.get(key);
            
            urlParameters.add(new BasicNameValuePair(key, val));
        }
        
        try {
            post.setEntity(new UrlEncodedFormEntity(urlParameters));
        } catch (UnsupportedEncodingException e) {
            throw new Error(e.getMessage());
        }
    }
    
    // 3. 응답결과
    try {
        HttpResponse res = client.execute(post);
        
        int statusCode = res.getStatusLine().getStatusCode();
        
        if(!HttpStatus.valueOf(statusCode).is2xxSuccessful()) {
            throw new Error("Response Error. [" + statusCode + "] - " + HttpStatus.valueOf(statusCode).name());
        } else {
            BufferedReader rd = new BufferedReader(new InputStreamReader(res.getEntity().getContent(), "utf-8"), 8);
            StringBuffer result = new StringBuffer();
            String line = "";
            while ((line = rd.readLine()) != null) {
                result.append(new String(URLDecoder.decode(line, "UTF-8")));
            }
            return result.toString();
        }
    } catch (IOException e) {
        throw new Error(e.getMessage());
    }
}
1개의 좋아요

@hay6308 그렇군요! 공유 감사드립니다~ PS) 님 자는 빼셔도 되요 ㅎㅎㅎ