我已经花了几个月的时间尝试在Android中使用SOAP API。起初这是一场艰巨的工作,因为我对SOAP几乎一无所知,并且没想到它会比REST难得多。我最终在Java方面取得了很大的进步,借助wsimport编写了一个纯Java库,可以将其插入Android应用程序中。我将他们的C#示例应用程序移植到JUnit测试中,并使一切工作正常。不幸的是,当需要将其构建到应用程序中时,我发现Android不包含或不支持必需的javax.xml.ws包。
我调查了ksoap2,虽然它声称可以做我想做的事,但我找不到能正常工作的免费解决方案来从wsdl中为其生成代码,因此我不愿意进行大量手动工作
我以前考虑过使用Node.js编写中间件,但是主要出于安全原因,因为SOAP API需要使用我们的固定凭据(而不是应用程序用户凭据)进行身份验证。我之所以选择它,是因为我认为这将意味着花费更多的时间(主要是从头开始用一种我不太熟悉的语言来编写SOAP客户端),而且听起来好像凭证泄漏不会造成很大的损害。 >
然后,今天,在Java库出现问题并寻找其他替代方法之后,我找到了LoopBack。意识到这将使编写中间件变得更加简单之后,我跳了进来。SOAP Calculator tutorial帮助我入门。
SOAP API返回错误,因为它需要在action
HTTP标头中添加一个Content-Type
值,而LoopBack不包含它。这是我的Java测试发出的成功请求中的样子:
application/soap+xml; charset=utf-8;action="http://tempuri.org/Ifluid/get_fluid"
这是在wsdl中的绑定下定义的方式:
<wsdl:operation name="get_fluid">
<soap12:operation soapAction="http://tempuri.org/Ifluid/get_fluid" style="document"/>
<wsdl:input>
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
我不知道如何在LoopBack上应用它。
我加入LoopBack chat room寻求帮助,基本上是在自言自语,因为我正在寻找解决办法。我的相关消息在下面进行了复制,并进行了一些格式更改。
根据WSDL 1.1 Binding Extension for SOAP 1.2 specification:
soapActionRequired属性(类型为xs:Boolean)(如果存在), 指示soapAction属性的值是否必须为 在请求消息中传达。如果soapActionRequired属性 省略,其值默认为“ true” 。当值 soapActionRequired为“ true”,soapAction属性必须为 礼物。
LB4的默认值为false
的{{1}}
那不能完全解决我的问题。 LB4将它作为strong-soap\src\parser\wsdl\operation.js:50
单独应用于标头,而不是附加到SOAPAction
,服务仍然不接受它。
通过将操作硬编码到Content-Type
上的Content-Type
,我可以强制执行该操作,并且服务给出了成功的响应。当然,这不是解决方案,因为操作随每次操作而变化。
在strong-soap\src\client.js:135
中将soapActionRequired
的默认值更改为true
,并在operation.js
处将headers.SOAPAction = '"' + soapAction + '"';
更改为headers['Content-Type'] += '; action="' + soapAction + '"';
,并且有效。由于将其放置在可以更改的模块中,因此不理想。我确定是否可以正常工作后,便可以打开请求请求。
SOAP Action Feature definition
许多SOAP 1.2基础协议绑定可能会利用 “ {application / soap + xml”媒体类型(在A. The application/soap+xml Media Type中进行了描述)以传输XML序列化的 SOAP消息。媒体类型指定了可选的操作参数, 可以用来优化调度或路由等。 动作功能指定了众所周知的URI来表示对 使用MIME的绑定中的action参数,也用于引用 参数本身的值。
“ action”:此可选参数可用于指定URI 标识消息的意图。在SOAP 1.2中, 具有与SOAPAction HTTP标头字段相似的目的 在SOAP 1.1中完成。即,其值确定了 消息。
action参数的值是绝对URI引用 如RFC 2396 [RFC2396]所定义,该属性必须为非空。 SOAP对URI或 它是可以解决的。虽然行动的目的 参数用于指示那里的SOAP消息的意图 是没有基于以下信息自动计算值的机制 SOAP信封。换句话说,该值必须为 确定带外。建议相同的值 用于识别逻辑上属于消息类型的集合 以某种方式连接,例如一部分 “服务”。强烈建议将URI设置为全局 随着时间的流逝而独特且稳定。
使用action参数是可选的。 SOAP接收器可能 将其用作优化处理的提示,但不应要求 它的存在以进行操作。
因此,LB4似乎可以正确地将操作应用于使用单独的client.js:150
头字段的SOAP 1.1,而不是将其移动到SOAPAction
的SOAP 1.2。
显然,SOAP接收器错误地要求执行该操作。