2016-11-28 60 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

我試圖從騾ESB消耗它。 – HanuAthena

+0

根據您的WSDL,此SOAP響應**無效**。你應該有這樣的事情: <新:MyRequestResponse的xmlns:新= 「HTTP://富/欄」>確定 \t 你真的使用JAX-WS實現產生這種反應? – cdan

回答

3

根據規範,這不是一個有效的SOAP 1.1 Body元素。所以它實際上不是SOAP響應。

因爲它不是一個有效的SOAP響應,並且不發送任何複雜的參數,所以嘗試使用SOAP框架調用這樣的服務確實沒什麼價值。

將它作爲一種專有格式的普通HTTP服務處理會更有意義。發送HTTP POST請求並從響應中提取正文內的「OK」部分。如果命名空間前綴不會改變,即使不解析XML,也可以做到這一點。儘管看起來像一個「黑客」,但它比使用非明顯的攔截器和一個模糊的設置來破解框架並迫使它做規範之外的事情更加乾淨和可維護。任何追隨你,檢查代碼的人都必須花時間瞭解處理這種獨眼的SOAP背後的所有因素。

但是,如果有時有一個符合規範的有效複雜SOAP體,並且有時候會有像OK這樣無效的任意內容,那麼重新實現SOAP解析並不合理,並且攔截器是要走的路,將無效消息內聯與規格。在混合的情況下,我認爲沒有簡單的乾淨的方式來使用SOAP/WSDL規範進行映射,除非消息被攔截器預處理和修復。

0

如果你看看here,你可以看到SOAP信封的基本XSD格式。所以,如果你把你的「OK」字符串並將它添加到身體中的字符串元素,這是一個字符串標記,那麼你應該沒問題。

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

而且作爲XML:

<message>OK</message> 

截至目前你的XML是無效的。正文和標題中的元素必須具有數據類型。

+0

HanuAthena已經在評論中解釋說,對收到的回覆沒有控制權。你在這裏寫的是兩天前提出的。 –

+0

啊沒有看到 - 它的評論不是答案。 –

+0

無論如何 - 你不能指望運行一個肥皂端點,它接受無效的xml作爲輸入 –

相關問題