[英]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:我也知道有些工具可以做到這一點,比如SOAPUI
和XMLSpy
。 同樣,我需要在我的Java程序中進行此驗證。
ps:我知道我可以提取SOAP
消息的正文部分,並根據XSD
對其進行驗證。 但是,我想根據WSDL
驗證整個SOAP
消息。
您可以在開源soapUI項目中查看WsdlValidator類的源代碼。
https://github.com/SmartBear/soapui
http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/support/wsdl/WsdlValidator.html
如果您使用基於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
試試這個
在處理程序中,嘗試使用public boolean handleRequest(MessageContext mc)
的以下代碼添加這些行
mc.setProperty("USE_TEST_FILE", <your response in .xml file>); return false;
在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消息的這個模式。 你可以:
如果要對特定的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.