포스트 요청에서 JAX-RS 클라이언트의 응답 본문 읽기
모바일 앱과 웹 서비스 사이에 일종의 프록시가 있기 때문에, 우리는 포스트 리퀘스트의 대응에 곤혹스러워하고 있습니다.상태 200: OK의 응답을 받습니다.그러나 JSON 응답 본문을 찾거나 추출할 수 없습니다.
Client client = ClientBuilder.newClient();
WebTarget webTarget = client.target(WEBSERVICE_BASE_LOCATION + "mobileDevices?operatorCode=KPNSCP");
String jsonString = "{\"osVersion\":\"4.1\",\"apiLevel\":16,\"devicePlatform\":\"ANDROID\"}";
Builder builder = webTarget.request();
Response response = builder.post(Entity.json(jsonString));
JAX-RS를 사용하고 있습니다.JSON 본문을 추출할 수 있는 힌트를 주세요.String
서버 응답에서?
이것을 시험해 보세요.
String output = response.getEntity(String.class);
편집
@Martin Spamer가 Jersey 1.x 항아리에서만 사용할 수 있다고 언급해 주셔서 감사합니다.Jersey 2.x의 경우
String output = response.readEntity(String.class);
방금 jaxrs-ri-2.16에 대한 솔루션을 찾았습니다. 간단히 사용하세요.
String output = response.readEntity(String.class)
이것은 예상대로 콘텐츠를 전달합니다.
사용 사례의 경우 서버 측 유닛 테스트를 작성 중이었기 때문에 위의 답변은 모두 작동하지 않았습니다.이 테스트에서는 "Unable to Mock Glassfish Jersey Client Response Object" 질문에 설명된 다음 오류 메시지가 표시되므로 불합격했습니다.
java.lang.IllegalStateException: Method not supported on an outbound message.
at org.glassfish.jersey.message.internal.OutboundJaxrsResponse.readEntity(OutboundJaxrsResponse.java:145)
at ...
이 예외는 다음 코드 행에서 발생했습니다.
String actJsonBody = actResponse.readEntity(String.class);
문제의 코드 행을 다음과 같이 바꾸는 것이 수정되었습니다.
String actJsonBody = (String) actResponse.getEntity();
또, 같은 문제가 있었습니다.유닛 테스트의 콜 코드를 실행하려고 하면,readEntity
사용할 수 없습니다.getEntity
제품 코드에 포함되어 있습니다.왜냐하면 이 코드에서는ByteInputStream
본문의 내용도 아니고 유닛 테스트에서만 히트하는 생산 코드를 추가할 수 없습니다.
내 해결책은 응답을 만들고 나서 모키토 스파이를 이용해서 그 정보를 조롱하는 것이었다.readEntity
방법:
Response error = Response.serverError().build();
Response mockResponse = spy(error);
doReturn("{jsonbody}").when(mockResponse).readEntity(String.class);
다음 명령어는 사용할 수 없습니다.when(mockResponse.readEntity(String.class)
같은 것을 던지기 때문에 옵션입니다.IllegalStateException
.
이게 도움이 됐으면 좋겠네요!
매뉴얼에 따라 Jax rs 2.0의 getEntity 메서드는 InputStream을 반환합니다.JSON 형식의 InputStream에서 String으로 변환해야 할 경우 두 형식을 캐스팅해야 합니다.예를 들어 다음 방법을 구현했습니다.
private String processResponse(Response response) {
if (response.getEntity() != null) {
try {
InputStream salida = (InputStream) response.getEntity();
StringWriter writer = new StringWriter();
IOUtils.copy(salida, writer, "UTF-8");
return writer.toString();
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
return null;
}
이 방법을 구현한 이유차이점을 읽으면 많은 개발자가 다음 방법을 사용하여 Jaxr 버전에서 동일한 문제를 겪고 있음을 블로그에 알 수 있습니다.
String output = response.readEntity(String.class)
그리고.
String output = response.getEntity(String.class)
첫 번째는 com의 jersey-client를 사용하여 작동합니다.sun.glassfish.core.core에서 jersey-client를 사용하여 발견된 두 번째 라이브러리입니다.
이것이 저에게 나타난 오류입니다.org.glassfish.jersey.client.internal.httpUrlConnector$2는 java.lang에 캐스트할 수 없습니다.스트링
다음과 같은 종속성을 사용합니다.
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.28</version>
readEntity 메서드가 작동하지 않는 이유는 알 수 없습니다.당신이 해결책을 사용할 수 있기를 바랍니다.
카를로스 세페다
코드의 개정을 깨닫고, 판독 방법이 나에게 맞지 않는 원인을 알게 되었습니다.문제는 프로젝트에서 jersey 1.x를 사용한 의존관계 중 하나였습니다.버전을 업데이트하고 클라이언트를 조정하면 동작합니다.
다음과 같은 종속성을 사용합니다.
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.28</version>
안부 전해요
카를로스 세페다
언급URL : https://stackoverflow.com/questions/18086621/read-response-body-in-jax-rs-client-from-a-post-request
'programing' 카테고리의 다른 글
moment.js가 웹 팩으로 로케일을 로드하지 않도록 하는 방법 (0) | 2023.01.02 |
---|---|
JavaScript의 Date 컨스트럭터에서 month 인수의 범위는 왜0 ~ 11 인가요? (0) | 2023.01.02 |
Larabel 대기열 프로세스 시간 초과 오류 (0) | 2023.01.02 |
Python이 git bash 명령줄에서 작동하지 않음 (0) | 2023.01.02 |
PHP 오류: 치명적인 오류: 상수 식에 잘못된 작업이 포함되어 있습니다. (0) | 2023.01.02 |