如何在node.js中使用node-soap设置标头

时间:2012-05-18 21:01:24

标签: node.js soap express

我正在尝试使用wsdl服务并找到了node-soap,但我找不到如何设置一些标头。

示例:

header = {
  "Username": "foo",
  "Password" : "bar"
}

我需要这个的原因是因为我尝试使用的wsdl需要通过标题输入用户名和密码。

提前致谢

6 个答案:

答案 0 :(得分:6)

现在可能没什么用处,但是为了回答这个仍然开放的问题,就在这里。

您可以使用Client.addSoapHeader方法。根据文件

  

Client.addSoapHeader(soapHeader [,name,namespace,xmlns]) - 添加   soapHeader到soap:标题节点

     

选项

     

soapHeader对象({rootName:{name:“value”}})或严格的xml-string   第一个arg为object时的可选参数:

     

name Unknown参数(它可能只是一个空字符串)

     

xml名称空间的名称空间前缀

     

xmlns URI

所以你需要创建一个对象并将其传递给这个方法,如:

var soapHeader = {
  "Username": "foo",
  "Password" : "bar"
};
client.addSoapHeader(soapHeader);

答案 1 :(得分:1)

阅读node-soap的README,如果你要做的不是WS-Security(我不知道,因为我远离SOAP ),然后你将不得不向作者提出问题,因为根据文档我没有办法设置自定义标题。

如果 WS-Security,请按照on this part of the README的说明进行操作。

答案 2 :(得分:0)

soap = require('soap')
parseString = require('xml2js').parseString

soap.createClient('https://api.bingads.microsoft.com/Api/Advertiser/AdIntelligence/v9/AdIntelligenceService.svc?wsdl', function(err, client) {
  var soapHeader = {
    'AuthenticationToken': process.argv[2],
    'DeveloperToken': process.argv[3],
    'CustomerId': process.argv[4],
    'CustomerAccountId': process.argv[5]
  };
  client.addSoapHeader(soapHeader);
  client.SuggestKeywordsFromExistingKeywords({Keywords: ["Hello world"]}, function(err, result) {
    console.log(result.body);
  });
});

这不会奏效。回复是无效的登录凭据。相同的凭据可以与SOAPUI一起使用。因此,发送其他答案中提到的登录凭据的格式必定是错误的。

答案 3 :(得分:0)

这对我有用。 create client方法需要wsdl_header来检索wsdl定义。创建后,您需要设置基本身份验证安全性。

var url = 'your WSDL url';
var auth = "Basic " + new Buffer("username" + ":" + "password").toString("base64");

soap.createClient( url,{ wsdl_headers: {Authorization: auth} }).then(
    function(client){
        client.setSecurity(new soap.BasicAuthSecurity('rflhconfort_ws', '6syqxje9'));
        client.your_Method(args); 
    }

答案 4 :(得分:0)

我遇到了同样的问题,下面解决了这个问题 我使用SOAPUI Client插入数据的wsdl(以查看所需的字段)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:yourUrn">
<soapenv:Header>
  <urn:AuthenticationMethod>
     <urn:userName>username</urn:userName>
     <urn:password>password</urn:password>
   </urn:AuthenticationMethod>
    </soapenv:Header>
    <soapenv:Body>
    <urn:SoapFunctionToCall>
     <urn:Field1>Text</urn:Field1>
      <urn:Field2>Text</urn:Field2>
       <urn:Field3>Text</urn:Field3>
        <urn:Field14>Text</urn:Field4>
         <urn:Field5>Text</urn:Field5>
         <urn:Field6>Text</urn:Field6>
      </urn:SoapFunctionToCall>
     </soapenv:Body>
    </soapenv:Envelope>

下面是我在节点中调用的方法

function createSoapEntry(){
let url = "your wsdl url"
var credentials = {
    AuthenticationMethod:{
        userName: "username",
        password: "password"
    }  
}
let args = { 
            Field1:"Text",
            Field2:"Text",
            Field3:"Text",
            Field4:"Text",
            Field5:"Text",
            Field6:"Text"            
    }
soap.createClient(url, function (err, client){
    client.addSoapHeader(credentials)

    client.SoapFunctionToCall(args, function (err, res) {
        if (err) {
            console.log("Error is ----->" + err)
        } else {
            console.log("Response is -----> " + res)
        }
    })
})

 }

答案 5 :(得分:0)

根据documentation,对于聚合HTTP标头,您可以放置​​标头,示例代码:

soap.createClient(url, 

    function (err, client) {
      if(err){
          console.log(err);
      } else{
          console.log(client.describe())
          var soapHeaders = {
              'Channel':'PB',
              'RqUID':'1987'
          }
          client.addHttpHeader('<nameH1>', 'valueH1');
          client.addHttpHeader('<nameH2>', 'valueH2');
//then, continue calling the soap operation 

}