微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获取wsimport.exe以生成SOAP标头

如何解决如何获取wsimport.exe以生成SOAP标头

我已经阅读了许多有关使wsimport.exe生成SOAP标头的建议,但是我无法使它们中的任何一个起作用。我是SOAP Web服务的新手,没有很深的了解,但是尝试使用示例。

我有一个WSDL文件,并且能够为远程Web服务生成客户端代理存根(使用Eclipse和wsimport.exe)。它几乎可以工作。但是,在发送消息时,Web服务调用会失败(例如Submit(提交一个字符串参数))。原因似乎是因为SOAP服务需要在SOAP消息中带有“ Action”标头的“标头”部分:

<S:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
   <wsa:Action>
      http://www.fmcsa.dot.gov/schemas/FMCSA.ELD.Infrastructure/IELDSubmissionService/Submit
   </wsa:Action>
</S:Header>

客户端代理存根根本不生成SOAP标头部分或“ Action”标头。相反,它向http请求“ Content-Type”标头添加了“操作”:

Content-Type: application/soap+xml;charset="utf-8";action="http://www.fmcsa.dot.gov/schemas/FMCSA.ELD.Infrastructure/IELDSubmissionService/Submit"

但是,Web服务端点似乎坚持使用标头部分。

我尝试将生成的SOAP xml表示形式(从日志记录中捕获)放入SoapUI工具中。它也失败了。但是,当我手动将Content-Type http请求标头添加到SoapUI请求时,它起作用了-因为SoapUI某种程度上知道可以从Content-Type创建SOAP <header>部分!

因此,wsimport.exe和SoapUI的组合使我能够成功提交SOAP消息。但是我确实需要wsimport.exe来生成客户端存根,该存根将成功发送消息并接收响应。我曾尝试修改WSDL文件,以按照IBM的示例显式地和隐式地添加“标头”,但不幸的是,wsimport.exe会生成相同的代码。我在代理代码中尝试了批注,但遇到了我无法理解的错误

我能够使用以下代码在Java“包装器”中成功添加标头:

    WSBindingProvider bp = (WSBindingProvider) eldPort;
    Header hdrAction = Headers.create(new QName("http://www.w3.org/2005/08/addressing","Action"),"http://www.fmcsa.dot.gov/schemas/FMCSA.ELD.Infrastructure/IELDSubmissionService/Submit");
    bp.setoutboundHeaders(hdrAction);

请求似乎已通过。不幸的是,在处理响应时,客户端代理代码中似乎有一个错误-因为响应也具有相同的“ Action”标头。而且我无法找到一种方法来轻松告诉响应代码以查找此标头。

我想找出为什么WSDL似乎没有wsimport.exe的信息来生成与Web服务通信的代码。如果它是错误的WSDL,我想通知Web服务有关它。但是我怀疑在整个过程中缺少某些东西。希望能对此有所帮助。

我将发布WSDL文件,但是首先我将检查是否需要许可,因为它似乎仅对已注册的FMCSA开发人员可用。但是,如果有尝试尝试的方法或了解该方法方法,我将不胜感激。

--------更新---------- 我能够使生成的代理存根代码添加一个成功提交的“动作”标头和一个标头部分,但是只能通过向提交方法添加一个附加的“动作”参数并在服务接口中将“提交”方法注释为如下:

公共ELDSubmissionResponse提交( @WebParam(name =“ data”,targetNamespace =“ http://www.fmcsa.dot.gov/schemas/FMCSA.ELD.Infrastructure”) ELD提交数据, @WebParam(名称=“操作”,targetNamespace =“ http://www.w3.org/2005/08/addressing”,标头= true) 字符串操作);

上面的代码生成了以下SOAP XML:

<S:Header>
<ns4:Action xmlns="http://www.fmcsa.dot.gov/schemas/FMCSA.ELD.Infrastructure" xmlns:ns2="http://www.fmcsa.dot.gov/schemas/FMCSA.ELD.Models" xmlns:ns3="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:ns4="http://www.w3.org/2005/08/addressing">http://www.fmcsa.dot.gov/schemas/FMCSA.ELD.Infrastructure/IELDSubmissionService/Submit
</ns4:Action>
</S:Header>

优点是不需要以编程方式添加标头(这不能解决响应解析错误)。我确实需要在Submit调用添加“ action”参数,并根据需要传递soap action URL。

当然,这不是一种可维护的方法,因为将来可能会更改WSDL文件。真正的目标是生成一个驱动wsimport.exe的WSDL文件,以创建写入标头部分的代码,并将其显示给Web服务提供商以解决开发人员的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。