Как получить тело ответа HTTP в CXF, когда WebService возвращает код 403? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь разработать клиентское приложение для WebService, используя библиотеку Apache CXF.В этой конкретной реализации сервера, когда в запросе отсутствуют некоторые данные (например, идентификационный номер какого-либо лица), он возвращает HTTP-код 403 (запрещенный), но с телом ответа, содержащим подробные сведения об ошибке приложения в виде ошибки мыла.

В качестве примера, вот ответ, который я собрал с помощью SoapUI:

Response in the SoapUI
Как видно из выделенного текста, в этом запросе есть тело ответа.


Теперь мне нужно получить тело ответа из моего приложения.Я пытался использовать перехватчики в разных фазах, таких как SEND_ENDING и POST_PROTOCOL, но не могу найти его в параметре Message, заданном для метода handleMessage().

Чего мне не хватает?

Вот исключение и трассировка стека, которую я получаю:

org.apache.cxf.interceptor.Fault: Could not send Message.
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:67)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:440)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:355)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)
    at com.sun.proxy.$Proxy36.arquivo(Unknown Source)
    at br.com.dgsistemas.TesteWS.main(TesteWS.java:133)
Caused by: org.apache.cxf.transport.http.HTTPException: HTTP response '403: Forbidden' when communicating with https://www.wsrestrito.caixa.gov.br/siies/WsSolicitacao
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.doProcessResponseCode(HTTPConduit.java:1620)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1627)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1572)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1373)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:673)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
    ... 9 more

Спасибо!

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вы должны иметь возможность расширить AbstractSoapInterceptor, зарегистрировать это в фазе Phase.MARSHAL и извлечь сообщение в переопределении handleMessage.

Используйте SoapMessage.getExchange (). GetInMessage () или .getInFaultMessage () для извлечения сообщения из ответа SOAP.

0 голосов
/ 13 февраля 2019

Вы пытались использовать для этого LoggingInInterceptor ( См. Описание ) или расширили его и переписали метод handleMessage.Его можно использовать для мониторинга всех сообщений SOAP IN

Пример использования можно найти здесь

0 голосов
/ 05 февраля 2019

У вас есть две независимые проблемы.

Сначала вы должны удалить чанкованное сообщение.http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html#ClientHTTPTransport(includingSSLsupport)-ANoteAboutChunking

Прежде чем вызывать конечную точку, вы должны отключить частичную связь:

   HTTPConduit conduit = (HTTPConduit) client.getConduit();
   HTTPClientPolicy policy = new HTTPClientPolicy();


   // Chunking is by default enabled in CXF webservices so we have to disable it.     
   policy.setAllowChunking(false);
   conduit.setClient(policy); // update HTTP client's conduit

Во-вторых, я думаю, вам нужно удалить спецификацию.Вы можете увидеть, что это такое в следующей заметке википедии: https://en.wikipedia.org/wiki/Byte_order_mark

Если вы хотите удалить спецификацию, отметьте это: Порядок следования байтов портит чтение файлов в Java

ПРИМЕЧАНИЕ 1. Сообщения в чанках зависят от настроек сервера, сервер может игнорировать настройку вашего запроса.

ПРИМЕЧАНИЕ 2. Если вы пишете потоковый перехватчик, вы можете обрабатывать как спецификации, так и сообщения в блоках.Чанкованные сообщения не имеют заголовка Content-Length, и хотя фактическая длина меньше ожидаемой, вам придется ждать больше сообщений от сервера.

...