我需要针对WSDL
验证SOAP消息吗?
(与XML
模式可以验证XSD
文件的方式相同。
我没有打电话给任何网络服务;
我只有一条SOAP
消息和一个WSDL
,我需要验证SOAP
消息是否正确。
没有调用网络服务或之后的任何内容。
我需要在Java程序中进行此验证。 你知道一个小的Java库吗?
ps:我知道几个JAX-WS
库可以在您调用Web服务时验证请求/响应。但同样,我没有打电话给任何网络服务;我有一条简单的SOAP
消息和一个WSDL
,我需要一个功能来验证针对SOAP
的{{1}}消息。
ps:我也知道有可以执行此操作的工具,例如WSDL
和SOAPUI
。同样,我需要在我的Java程序中进行此验证。
ps:我知道我可以提取XMLSpy
消息的正文部分,并根据SOAP
对其进行验证。不过,我想针对XSD
验证整个SOAP
邮件。
答案 0 :(得分:6)
您可以在开源soapUI项目中查看WsdlValidator类的源代码。
https://github.com/SmartBear/soapui
http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/support/wsdl/WsdlValidator.html
答案 1 :(得分:1)
如果您使用基于Apache CXF或Apache Axis 2的代码生成器创建Web服务客户端,只要Web服务提供者和您的客户端处于相同版本,您的Web服务代码就可以正常工作。 SOAP / WS *标准。基于您选择调用Web服务的API,您可以查看该API的日志记录功能是否可用于打印生成的SOAP请求。
另一种方法可能是使用像SOAPUI这样的工具。您可以尝试使用基于您拥有的WSDL的SOAP UI设置模拟Web服务,然后通过调用模拟服务来调用测试您的Web服务客户端。请参阅此处的{00}}
中的SOAP UI链接答案 2 :(得分:0)
我认为你可能正在寻找一个对你真正需要的东西过于复杂的答案。您真正需要做的就是注册相应的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
并在解析/验证文档期间使用它。
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"));
答案 3 :(得分:0)
您可以使用您拥有的WSDL创建存根,然后使用XML请求对存根进行查询。如果这一点正确,您的请求是正确的。
您可以在项目中导入WSDL,然后使用XML调用存根服务。这样,您可以在不更改代码的情况下更改验证。
答案 4 :(得分:0)
试试这个
在处理程序中,尝试以下代码
在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无效,代理将失败
答案 5 :(得分:0)
由于SOAP消息是xml,您可以针对xsd验证整个消息。例如,我发现了SOAP消息的this模式。你可以:
如果您想要针对特定的WSDL进行验证,您可以手动准备架构:只需放置消息的根元素而不是此部分:
<xs:sequence>
<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
在SOAP模式中。
答案 6 :(得分:0)
验证SOAP envelope schema,然后提取正文和标题并针对特定架构进行验证。应该够简单。
答案 7 :(得分:-3)
请查看Apache AXIS2 API。