2016-11-28 10 views
5

Как обращаться с ответом на сообщение SOAP, как показано ниже?Тело ответа SOAP имеет простой текст без каких-либо узлов

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:new="http://foo/bar"> 
    <S:Header/> 
    <S:Body>OK</S:Body> 
</S:Envelope> 

вот мои определения в WSDL:

<wsdl:operation name="MyRequest"> 
      <wsdl:input message="tns:MyRequest" name="MyRequest"> 
      </wsdl:input> 
      <wsdl:output message="tns:MyRequestResponse" name="MyRequestResponse"> 
      </wsdl:output> 
</wsdl:operation> 

<xs:element name="MyRequestResponse" type="xs:string"/> 

Услуги:

@WebMethod(operationName = "MyRequest") 
@WebResult(name = "MyRequestResponse", targetNamespace = "http://foo/bar", partName = "parameters") 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 
public String MyRequest(
      @WebParam(name = "MyRequest", targetNamespace = "http://foo/bar", partName = "parameters") 
      MyRequest parameters); 

Я пытался использовать перехватчик и обернуть ответ 'OK' с узлами. Но, интересно, есть ли более чистый способ сделать это, обратившись к самому слою JAXB/WSDL.

+0

Вы пытаетесь произвести или использовать ответ OK? – approxiblue

+0

Я пытаюсь уничтожить его у Mule ESB. – HanuAthena

+0

Этот ответ SOAP ** не действителен ** в соответствии с вашим WSDL. Вы должны иметь что-то вроде: <новый: MyRequestResponse XMLNS: новый = "HTTP: // Foo/бар"> OK \t ли вы на самом деле использовать реализацию JAX-WS для создания этого ответа? – cdan

ответ

3

Недействительный элемент SOAP 1.1 Body в соответствии со спецификацией. На самом деле это не ответ SOAP.

Поскольку это недействительный ответ SOAP, и вы не отправляете какие-либо сложные параметры, на самом деле мало смысла пытаться вызвать такую ​​услугу с использованием структуры SOAP.

Будет иметь смысл рассматривать его как простой HTTP-сервис с проприетарным форматом. Отправьте запрос HTTP POST и извлеките часть «ОК» внутри тела из ответа. Если префикс пространства имен не будет изменен, вы можете сделать это даже без синтаксического анализа XML.

Несмотря на то, что он выглядит как «взломанный», это гораздо более чистый и удобный подход, чем переход с неочевидными перехватчиками и неясная настройка для взлома рамки и заставить ее делать что-то вне спецификации. Любой, кто идет за вами, исследуя код, должен будет потратить время на понимание всех механизмов, связанных с обработкой этого одноглазого SOAP.

Если, однако, иногда существует допустимое сложное тело SOAP, соответствующее спецификации, а иногда есть недопустимый произвольный контент, такой как ОК, повторное выполнение SOAP-анализа не оправдано, а перехватчики - это путь, чтобы привести недействительные сообщения в строку со спецификацией. В смешанном случае я считаю, что нет простого простого способа сопоставления с использованием спецификации SOAP/WSDL, если сообщения не предварительно обработаны и не исправлены перехватчиками.

0

Если вы посмотрите here, вы можете увидеть базовый формат XSD для конверта SOAP. Поэтому, если вы берете строку «ОК» и добавляете ее в строковый элемент в теле, который является строковым тегом, тогда вы должны быть в порядке.

<xs:element name="message" type="xs:string"/> 

И как для XML:

<message>OK</message> 

В настоящее время ваш XML не является действительным. Элементы в теле и заголовке должны иметь тип данных.

+0

HanuAthena уже объяснил в комментариях, что нет контроля над полученным ответом. То, что вы написали здесь, уже было предложено за два дня до этого. –

+0

Ах не видел этого - его комментарий не ответ. –

+0

Anyways - вы не можете ожидать запуска конечной точки мыла, которая принимает недопустимый xml в качестве ввода –