LoopBack:如何在HTTP请求标头中将SOAP操作添加到Content-Type?

时间:2019-07-17 21:03:16

标签: node.js soap wsdl loopbackjs

我想要完成的事情的一些背景故事

我已经花了几个月的时间尝试在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上应用它。

更新1

我加入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 + '"';,并且有效。由于将其放置在可以更改的模块中,因此不理想。我确定是否可以正常工作后,便可以打开请求请求。


更新2:更多规范

SOAP Action Feature definition

  

许多SOAP 1.2基础协议绑定可能会利用   “ {application / soap + xml”媒体类型(在A. The application/soap+xml Media Type中进行了描述)以传输XML序列化的   SOAP消息。媒体类型指定了可选的操作参数,   可以用来优化调度或路由等。   动作功能指定了众所周知的URI来表示对   使用MIME的绑定中的action参数,也用于引用   参数本身的值。

RFC 3902

  

“ 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接收器错误地要求执行该操作。

0 个答案:

没有答案