npm soap with auth header

时间:2017-11-24 01:06:55

标签: node.js soap npm

我正在尝试使用npm soap包创建一系列端点到远程服务器,我可以通过角度4进行交互。我已经阅读了文档,但我仍然不清楚它的用法。下面是WSDL。如何创建可用于与下面的端点连接的客户端?这是WSDL。

http://208.180.122.191:8081/niku/wsdl/Query/ts_pending_approvals?tenantId=clarity

我的期望是我应该得到以下回复:

var soap = require('soap');
var url = 'http://208.180.122.191:8081/niku/wsdl/Query/ts_pending_approvals?tenantId=clarity';
var args = {Username: "jdoe", Password: "*******"};
soap.createClient(url, function(err, client) {
client.Login(args, function(err, result) {
        console.log(result);
    });
});

当我调用console.log(client.describe())时,我得到以下内容:

{ ts_pending_approvalsQueryService:
  { ts_pending_approvalsQueryService:
   { Query: [Object],
     Login: [Object],
     WrappedLogin: [Object],
     Logout: [Object] } } }

然而,当我呼叫登录并传递用户名和密码时,我得到了未定义。使用SoapUI,我能够使用以下方法成功完成请求。我的问题是如何在节点中模拟这个。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:quer="http://www.niku.com/xog/Query">
 <soapenv:Header/>
 <soapenv:Body>
    <quer:Login>
       <quer:Username>jdoe</quer:Username>
       <quer:Password>******</quer:Password>
    </quer:Login>
 </soapenv:Body>
 </soapenv:Envelope>

1 个答案:

答案 0 :(得分:0)

我能够通过设置端点来自行解决这个问题,该端点为我提供了预期的响应令牌:6312078__98C024DA-25CF-441E-A47B-A84DDE2FF140

var soap = require('soap');
var url = 'http://208.180.122.191:8081/niku/wsdl/Query/ts_pending_approvals';
var args = {Username: "jdoe", Password: "*****"};
soap.createClient(url, function(err, client) {
   client.setEndpoint("http://208.180.122.191:8081/niku/xog")
   client.Login(args,(error,result)=>{
       if (error) throw error;
       console.log(result)
   })
});

值得注意的是,当您使用该包并发送其他参数时,除了需要多个参数的复杂结构之外,您还可能必须发送映射到WSDL中指定的命名空间的标头。 。经过一番试验和错误,我能够弄清楚这一点。见下面的工作示例:

/////////////////////////////////////////////////////////////////////////////////////////////////////
// 1TS Open Timesheet

ppmRouter.get("/open_time_sheet",(req,res,next) => {

    var resourceid = req.query.param_resourceid

    var soap = require('soap');
    var url = config.wsdlQueryPath + 'open_time_sheet';
    var sheader = { Auth: {Username: config.xog_user, Password: config.password}}
    var args = { 
        Query:  {Code: "open_time_sheet"}, 
        Filter: {
            param_resourceid: resourceid
        }
    };

    soap.createClient(url, function(err, client) {
        client.addSoapHeader(sheader,"","tns","Auth");
        client.setEndpoint(config.xog_url)
        client.Query(args,(error,result)=>{
            if (error) throw error;
            console.log(result)
            res.send(result)
        })
    });

})