Eclipse Jersey 2 Client 에서 HTTP 요청 디버깅하기
JAX-RS(Jakarta RESTful Web Service) 구현물중 하나인 jersey 1.x 를 사용중이었는데 2.x 대로 업그레이드할 필요가 생겼습니다.
2.x 대의 마지막은 2.35 길래 이 버전으로 gradle 을 설정하고 매뉴얼 뒤져가며 2.x 대로 이식을 끝냈는데 REST API 요청이 HTTP 415 에러와 함께 실패했습니다.
ext { jerseyVersion = '2.34' } dependencies { implementation "org.glassfish.jersey.core:jersey-client:$jerseyVersion" implementation "org.glassfish.jersey.inject:jersey-hk2:$jerseyVersion" implementation "org.glassfish.jersey.media:jersey-media-sse:$jerseyVersion" implementation "org.glassfish.jersey.media:jersey-media-multipart:$jerseyVersion" }
이럴 경우 어떤 요청을 하는지 HTTP Request 를 출력해서 확인해 보면 바로 원인을 알수 있으므로 대수롭지 않게 생각했는데 이런.... Jersey 가 수행하는 HTTP Request 를 출력하는게 안 됐습니다.
매뉴얼에는 LoggingFeature 를 설정하고client 에 등록해주면 된다고 나왔는데 말이죠.
ClientConfig clientConfig = new ClientConfig(); clientConfig.property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_CLIENT, LoggingFeature.Verbosity.PAYLOAD_ANY); Client client = ClientBuilder.newClient(clientConfig);
이리 저리 해보다가 안 되서 구글링했고 다음과 같이 Jersey 를 사용하는 클래스에 LoggingFeature 를 설정하는 메서드를 만들고 client 에 이 메서드를 등록해주니 정상적으로 로그 출력이 됐습니다.
public LoggingFeature logging() { java.util.logging.Logger logger = java.util.logging.Logger.getLogger(this.getClass().getName()); return new LoggingFeature(logger, java.util.logging.Level.INFO, LoggingFeature.Verbosity.PAYLOAD_ANY, null); } ClientConfig clientConfig = new ClientConfig(); Client client = ClientBuilder.newClient(clientConfig); // LoggingFeature 등록 client.register(logging());
로그를 보니 HTTP 415 에러가 난 이유는 post 에 Entity.text() 를 호출해서 Content-Type 헤더가 text/plain 으로 가서였고 Entity.json() 으로 변경하니 정상적으로 동작했습니다/
webTarget.request(MediaType.APPLICATION_JSON + ";charset=utf-8") .header(HttpHeaders.AUTHORIZATION, "Bearer " + this.pat) // .post(Entity.text(content)); .post(Entity.json(content));