簡體   English   中英

Java的。根據WSDL驗證SOAP消息

[英]Java. Validate SOAP message against a WSDL

我需要針對WSDL驗證SOAP消息嗎? (與可以針對XSD架構驗證XML文件的方式相同)。

我沒有打電話給任何網絡服務; 我只有一個SOAP消息和一個WSDL ,我需要驗證SOAP消息是否正確。 無需調用網絡服務或之后的任何內容。

我需要在Java程序中進行此驗證。 你知道一個小的Java庫嗎?

ps:我知道幾個JAX-WS庫可以在您調用Web服務時驗證請求/響應。 但同樣,我沒有打電話給任何網絡服務; 我有一個簡單的SOAP消息和一個WSDL ,我需要一個根據WSDL驗證SOAP消息的函數。

ps:我也知道有些工具可以做到這一點,比如SOAPUIXMLSpy 同樣,我需要在我的Java程序中進行此驗證。

ps:我知道我可以提取SOAP消息的正文部分,並根據XSD對其進行驗證。 但是,我想根據WSDL驗證整個SOAP消息。

如果您使用基於Apache CXF或Apache Axis 2的代碼生成器創建Web服務客戶端,只要Web服務提供者和您的客戶端都在相同版本的SOAP / WS中,您的Web服務代碼就可以正常運行*標准。基於您選擇調用Web服務的API,您可以查看該API的日志記錄功能是否可用於打印生成的SOAP請求。

另一種方法可能是使用像SOAPUI這樣的工具。 您可以嘗試使用基於您擁有的WSDL的SOAP UI設置模擬Web服務,然后通過調用模擬服務來調用測試您的Web服務客戶端。 請參閱SOAP UI鏈接http://www.soapui.org/Getting-Started/web-service-sample-project/1-Web-Service-Mocking.html

試試這個

  1. 使用WSDL並創建Jax-RPC代理
  2. 創建一個Web服務JAX RPC處理程序並將其注冊到Web服務引用請參閱此鏈接以了解如何創建Web服務處理程序
  3. 在處理程序中,嘗試使用public boolean handleRequest(MessageContext mc)的以下代碼添加這些行

     mc.setProperty("USE_TEST_FILE", <your response in .xml file>); return false; 
  4. public boolean handleResponse(MessageContext mc)

     String testFileName = (String) mc.getProperty("USE_TEST_FILE"); InputStream instream = <read file as an input stream> SOAPMessageContext smc = (SOAPMessageContext) mc; SOAPMessage message = smc.getMessage(); SOAPPart soapPart = message.getSOAPPart(); soapPart.setContent(new StreamSource(instream)); smc.setMessage(message); return false; 

現在運行你的代理..如果消息對每個WSDL無效,代理將失敗

您可以使用您擁有的WSDL創建存根,然后使用XML請求對存根進行查詢。 如果這一點正確,您的請求是正確的。

您可以在項目中導入WSDL,然后使用XML調用存根服務。 這樣,您可以在不更改代碼的情況下更改驗證。

由於SOAP消息是xml,因此您可以針對xsd驗證整個消息。 例如,我發現了SOAP消息的這個模式。 你可以:

  1. 從wsdl中提取模式,
  2. 從wsdl和soap模式驗證針對模式的消息。

如果要對特定的WSDL進行驗證,可以手動為模式做好准備:只需放置消息的根元素而不是此部分:

<xs:sequence>
<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>

在SOAP模式中。

驗證SOAP信封架構 ,然后提取正文和標頭,並針對特定架構進行驗證。 應該夠簡單。

我認為你可能正在尋找一個對你真正需要的東西過於復雜的答案。 您真正需要做的就是注冊相應的DTD / XSD文檔,以便普通的JAXP類可以引用它們。

此代碼來自Sun / Oracle ,實現了一個基本的EntityResolver 您需要構建此類,以便它為DocumentBuilder提供適用於您嘗試驗證的文檔中定義的模式的InputSource

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;

public class MyResolver implements EntityResolver {
    public InputSource resolveEntity (String publicId, String systemId) {
        if (systemId.equals("http://www.myhost.com/today")) {
            // return a special input source
            MyReader reader = new MyReader();
            return new InputSource(reader);
        } else {
            // use the default behaviour
            return null;
        }
    }
}

使用此代碼,您可以EntityResolver自定義EntityResolver並在解析/驗證文檔期間使用它。

final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware = true;
dbf.setValidating = true;
final DocumentBuilder db = dbf.newDocumentBuilder();
final MyResolver r = MyResolver.newInstance();
db.setEntityResolver(r);
final Document docFromFile = db.parse("path/to/my/document.xml");
// or
final Document docFromStream = db.parse(new FileInputStream("blah"));

請查看Apache AXIS2 API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM