繁体   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