Получение кода состояния HTTP из ответа SOAP
Как я могу получить статус HTTP из результата SOAPConnection.call()
?
4 ответов
принято от W3C примечание по мылу (раздел 6.2)
SOAP HTTP следует семантике кодов состояния HTTP для передача информации о состоянии в HTTP. Например, состояние 2xx код указывает, что запрос клиента, включая компонент SOAP был успешно принят, понят, принят и т. д.
в случае ошибки SOAP при обработке запроса, HTTP SOAP сервер должен выдать внутренний сервер HTTP 500 Ошибка" ответ и включить сообщение SOAP в ответ, содержащий элемент ошибки SOAP (см. раздел 4.4), указывающий на ошибку обработки SOAP.
и документация по SOAPFault в API
элемент объекта SOAPBody, содержащий ошибка и / или состояние информация. Эта информация может относиться к ошибкам в SOAPMessage объект или проблемы, не связанные с содержимым само послание.
таким образом, возможный ответ может быть
SoapMessage soapMessage = null;
soapMessage = MySOAPConnection.call(...);
soapMessage.getSOAPPart().getEnvelope().getBody().getFault().getFaultCode();
некоторые ссылки, которые помогли мне создать этот ответ:
простой ответ-вы не можете. Зарывшись в HttpSOAPConnection код, локальный экземпляр объекта HttpURLConnection используется для коммуникации с целевой службой. Это получает код httpResponse, но он более или менее полностью скрывает его от вызывающего абонента. Все, что вы заключаете, это то, что если вы не получаете исключение, но возвращаемое SOAPMessage содержит SOAPFault, то код возврата был HttpURLConnection.HTTP_INTERNAL_ERROR (т. е. 500). Нет исключение и отсутствие SOAPFault означает, что код возврата был 200 до 206, все из которых являются" успешными " - к сожалению, запись состояния из заголовков HTTP в объекте HttpURLConnection явно не копируется в MIMEHeaders в возвращаемом SOAPMessage ...
// Header field 0 is the status line so we skip it.
что-нибудь еще вызовет исключение, и код начнется после открытой скобки в поле сообщения исключения и, вероятно, три цифры, трудно быть точным, потому что кто-то забыл закрыть скобка или любой другой разделитель перед сообщением...
throw new SOAPExceptionImpl(
"Bad response: ("
+ responseCode
+ httpConnection.getResponseMessage());
например:
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (502internal error - server connection terminated
Это ужасно полагаться на форматирование текстового сообщения в исключении,но код ответа не подвергается нигде.
вы можете получить доступ к заголовкам HTTP через интерфейс MessageContext.
http://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/MessageContext.html
самый прямой путь-это, вероятно, реализовать SOAPHandler, который даст вам доступ к MessageContext:
http://docs.oracle.com/cd/E15051_01/wls/docs103/webserv_adv/handlers.html#wp222394
однако, применения мыла обычно не предполагается строить взаимодействие на кодах состояния HTTP, поскольку они специфичны для транспорта.
У меня есть аналогичное требование, изложенное в этом вопросе, business analyst хочет регистрировать каждый код ответа http, связанный с каждым входящим и исходящим вызовами soap.. Мой ответ действителен для Apache CXF 2.7.5.
вы можете получить доступ к код состояния HTTP через интерфейс MessageContext ниже фрагмент кода в реализацию javax.в формате XML.с WS.обработчик.мыло.Интерфейс SoapHandler.
int status = (( javax.servlet.http.HttpServletResponse)messageContext.get("HTTP.RESPONSE")).getStatus();