티스토리 뷰

Java

[Java] URI 한글 인코딩 이슈

Jane Kwon 2021. 2. 10. 13:54
반응형

 

URI 를 임의적으로 조작하여 한글을 넣었을 경우, 검색 결과로 400번대 에러가 떨어져야 하는데 500 에러가 떨어진다.

원인은 URI 에 Query String 파라미터 값으로 한글이 들어갈 경우
backoffice web 에서 backoffice api 로 보내줄 때는 인코딩이 되는데
backoffice api 에서 aws core 로 넘어갈 때 한글 인코딩이 되지 않아 일어난 버그이므로 인코딩 처리를 해주면 된다.

 

WebClientHelper.java 에 URI 넘겨주는 부분에서 toASCIIString() 처리하여 넘겨주면 해결된다.

package com.jane.core.helper;

import java.net.URI;

@Log4j2
public class WebClientHelper {

  private static volatile WebClientHelper webClientHelper;
  private final WebClient webClient;

  @Getter @Setter
  private long connectTimeout = 4000;
  @Getter @Setter
  private long readTimeout = 4000;

  private static volatile HttpHeaders httpHeaders = new HttpHeaders();

  private WebClientHelper() {
    ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder()
        .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(-1)) // to unlimited memory size
        .build();

    webClient = WebClient.builder().exchangeStrategies(exchangeStrategies).build();
  }

  public static WebClientHelper getInstance() {
    if (webClientHelper == null) {
      synchronized (WebClientHelper.class) {
        if (webClientHelper == null) {
          webClientHelper = new WebClientHelper();
          
          httpHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
          httpHeaders.add(HttpHeaders.ACCEPT_CHARSET, "UTF-8");
        }
      }
    }

    return webClientHelper;
  }

  private  T syncHttpClient(HttpMethod httpMethod, URI uri, Object paramObject, Class valueType, HttpHeaders headers) {
    uri = URI.create(uri.toASCIIString());

    return webClient.method(httpMethod)
      .uri(uri)
      .headers(httpHeaders -> {
        httpHeaders.addAll(headers);
      })
      .body(BodyInserters.fromValue(paramObject))
      .exchange()
      .timeout(Duration.ofMillis(connectTimeout))
      .doOnError(e -> log.error("Connection Error : ", e))
      .onErrorReturn(null)
      .block(Duration.ofMillis(readTimeout))
      .bodyToMono(valueType)
      .doOnError(e -> log.error("Mapping Error : ", e))
      .onErrorReturn(null)
      .block();
  }

  private  Mono asyncHttpClient(HttpMethod httpMethod, URI uri, Object paramObject, Class valueType, HttpHeaders headers) {
    uri = URI.create(uri.toASCIIString());

    return webClient.method(httpMethod)
      .uri(uri)
      .headers(httpHeaders -> {
        httpHeaders.addAll(headers);
      })
      .body(BodyInserters.fromValue(paramObject))
      .exchange()
      .timeout(Duration.ofMillis(connectTimeout))
      .flatMap(clientResponse -> clientResponse.bodyToMono(valueType));
  }
}

 

 

 

 

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함