node-soap - 调用函数的正确方法

问题描述:

我对SOAP的使用绝对一无所知,但我的软件的重要组成部分要求我将其用于特定的Web服务。 Web服务的文档是为.net编写的,因此我很难理解我需要在这里做什么。最重要的是他们需要验证。node-soap - 调用函数的正确方法

对于连接我不需要授权,所以我能够检索描述函数的结果。它们分别是:

I20151214-09:20:20.381(-8)? Getting inside soap client creation method 
I20151214-09:20:20.722(-8)? Exception while invoking method 'createSoapClient' TypeError: Cannot call method 'describe' of undefined 
I20151214-09:20:20.723(-8)?  at Object.Soap.createClient (packages/zardak_soap/packages/zardak_soap.js:37:1) 
I20151214-09:20:20.724(-8)?  at [object Object].Meteor.methods.createSoapClient (controllers/server/testFiles.js:21:1) 
I20151214-09:20:20.724(-8)?  at maybeAuditArgumentChecks (livedata_server.js:1698:12) 
I20151214-09:20:20.725(-8)?  at livedata_server.js:708:19 
I20151214-09:20:20.725(-8)?  at [object Object]._.extend.withValue (packages/meteor/packages/meteor.js:1013:1) 
I20151214-09:20:20.726(-8)?  at livedata_server.js:706:40 
I20151214-09:20:20.726(-8)?  at [object Object]._.extend.withValue (packages/meteor/packages/meteor.js:1013:1) 
I20151214-09:20:20.726(-8)?  at livedata_server.js:704:46 
I20151214-09:20:20.727(-8)?  at tryCallTwo (C:\Users\Media Center\AppData\Local\.meteor\packages\promise\0.5.1\npm\node_modules\meteor-promise\node_modules\promise\lib\core.js:45:5) 
I20151214-09:20:20.727(-8)?  at doResolve (C:\Users\Media Center\AppData\Local\.meteor\packages\promise\0.5.1\npm\node_modules\meteor-promise\node_modules\promise\lib\core.js:171:13) 
I20151214-09:20:21.996(-8)? Getting inside the return of the create client 
I20151214-09:20:22.007(-8)? { PRIMEStandardV1_1: 
I20151214-09:20:22.008(-8)? { PRIMEStandardV1_1Soap: 
I20151214-09:20:22.009(-8)?  { RunTrip: [Object], 
I20151214-09:20:22.009(-8)?   ReverseGeocode: [Object], 
I20151214-09:20:22.010(-8)?   FindLocationsInRadius: [Object], 
I20151214-09:20:22.010(-8)?   FindLocationsOnRoute: [Object], 
I20151214-09:20:22.010(-8)?   FindLocationsInState: [Object], 
I20151214-09:20:22.011(-8)?   GetAverageDieselPriceInState: [Object], 
I20151214-09:20:22.012(-8)?   TestRadiusGeofence: [Object], 
I20151214-09:20:22.012(-8)?   TestRouteGeofence: [Object], 
I20151214-09:20:22.013(-8)?   RunSimpleTrip: [Object], 
I20151214-09:20:22.013(-8)?   Geocode: [Object], 
I20151214-09:20:22.014(-8)?   GetTodaysUSDieselAverage: [Object], 
I20151214-09:20:22.014(-8)?   GetTodaysCanadianDieselAverage: [Object], 
I20151214-09:20:22.015(-8)?   GetTripDistance: [Object], 
I20151214-09:20:22.016(-8)?   ValidateLocation: [Object] }, 
I20151214-09:20:22.017(-8)?  PRIMEStandardV1_1Soap12: 
I20151214-09:20:22.017(-8)?  { RunTrip: [Object], 
I20151214-09:20:22.018(-8)?   ReverseGeocode: [Object], 
I20151214-09:20:22.019(-8)?   FindLocationsInRadius: [Object], 
I20151214-09:20:22.021(-8)?   FindLocationsOnRoute: [Object], 
I20151214-09:20:22.021(-8)?   FindLocationsInState: [Object], 
I20151214-09:20:22.022(-8)?   GetAverageDieselPriceInState: [Object], 
I20151214-09:20:22.022(-8)?   TestRadiusGeofence: [Object], 
I20151214-09:20:22.023(-8)?   TestRouteGeofence: [Object], 
I20151214-09:20:22.023(-8)?   RunSimpleTrip: [Object], 
I20151214-09:20:22.024(-8)?   Geocode: [Object], 
I20151214-09:20:22.025(-8)?   GetTodaysUSDieselAverage: [Object], 
I20151214-09:20:22.025(-8)?   GetTodaysCanadianDieselAverage: [Object], 
I20151214-09:20:22.026(-8)?   GetTripDistance: [Object], 
I20151214-09:20:22.026(-8)?   ValidateLocation: [Object] } } } 

无壳: I20151216-11:53:14.658(-8)? {字典: I20151216-11:53:14.658(-8)? {'cache-control':'private', I20151216-11:53:14.659(-8)? 'content-type':'text/xml; charset = utf-8', I20151216-11:53:14.659(-8)?服务器:'Microsoft-IIS/7.0', I20151216-11:53:14.660(-8)? 'x-aspnet-version':'4.0.30319', I20151216-11:53:14.660(-8)? 'x-powered-by':'ASP.NET', I20151216-11:53:14.661(-8)? date:'Wed,16 Dec 2015 19:40:29 GMT', I20151216-11:53:14.661(-8)?连接:'close', I20151216-11:53:14.662(-8)? 'content-length':'441'}}, I20151216-11:53:14.662(-8)?管道:[功能], I20151216-11:53:14.663(-8)? addListener:[Function:addListener], I20151216-11:53:14.664(-8)? on:[Function:addListener], I20151216-11:53:14.665(-8)?暂停:[功能], I20151216-11:53:14.665(-8)?简历:[功能], I20151216-11:53:14.666(-8)?阅读:[功能], I20151216-11:53:14.666(-8)? body:'soap:ServerServer无法处理请求。 --- >对象引用未设置为对象的实例。' } I20151216-11:53:16.716(-8)?错误:[对象对象] I20151216-11:53:16.722(-8)? {Envelope:{Body:{Fault:[Object]}}} I20151216-11:53:16.723(-8)? undefined

正如你所看到的我能够连接。现在把我拖出去的部分是实际调用其中一个函数。以下是我用来尝试调用“RunSimpleTrip”的代码。然而,当我控制台记录结果时,它是一个巨大的混乱的消息,最终在我的cmd窗口运行缓冲区,我只能回想起一些方法,没有任何意义。

var url = 'http://prime.promiles.com/Webservices/v1_1/PRIMEStandardV1_1.asmx?wsdl'; 

     var simpleTrip = { 
          AvoidTollRoads:  false, 
          BorderOpen:   true, 
          RoutingMethod:  "PRACTICAL", 
          TripLegs:   [{LocationText: "77611"}, 
               {LocationText: "90210"}] 
         } 

     Soap.createClient(url, function(err, client) { 
      console.log(client.describe()); 
      client.setSecurity(new Soap.BasicAuthSecurity('hoperd', 'mailaaron', 'bkkyt')); 
      client.PRIMEStandardV1_1.PRIMEStandardV1_1Soap.RunSimpleTrip(simpleTrip, function(err, result, raw, soapHeader) { 
       //console.log("Result: "); 
       console.log(result); 
       console.log("Error: " + err.root); 
       console.log(err.root); 
       console.log(soapHeader); 
       // result is a javascript object 
       // raw is the raw response 
       // soapHeader is the response soap header as a javascript object 
      }) 
     }); 

从API的文档,这是他们使用.NET

PRIMEEnterpriseV1 PRIME = new PRIMEEnterpriseV1(); 

//Authorization Credentials 
Credentials c = new Credentials(); 
c.Username = "MyUsername; 
c.Password = "MyPassword"; 
c.CompanyCode ="MyCompanyCode"; 

SimpleTrip st = new SimpleTrip(); 
st.AvoidTollRoads = false; 
st.BorderOpen = true; 
st.RoutingMethod = com.promiles.PRIME.Enterprise.RouteMethod.PRACTICAL; 

TripLeg[] Legs = new TripLeg[2]; 

//Origin 
TripLeg t = new TripLeg(); 
t.LocationText = "77611"; 
Legs[0] = t; 

//Destination 
t = new TripLeg(); 
t.LocationText = "90210"; 
Legs[1] = t; 

st.TripLegs = Legs; 

//Call Function 
SimpleTrip rt = PRIME.RunSimpleTrip(c, st); 

我希望有人提供有有线索这一神秘事件,我还是可以点我在正确的如何调用同一个函数关于如何正确连接这个这个方向。任何和所有的帮助将不胜感激。

+0

Node-soap包含错误中的整个响应对象,这可能是为什么输出对于控制台来说太大的原因。而不是'console.log(“Error:”+ err);'try'console.log(“Error:”+ err.root);'。这可能会给你一些更有用的信息。 在您的第一个输出中,它看起来像您的初始createClient调用失败,并返回一个空的'client'('Can not call method'describe''undefined')。该回调的错误是什么样的? – jakeorr

+0

我添加了'console.log(“Error:”+ err.root);'它产生以下内容:错误:[对象对象],所以我只是console.log(err.root);它产生了这样的结果:{Envelope:{Body:{Fault:[Object]}}}, – BobFranz

+0

但是我能够从神秘的结果消息中解密出来的一件事是:body:' soap:服务器服务器无法处理请求。 --- >对象引用未设置为对象的实例 faultstring> soap:Envelope>' – BobFranz

所以经过多次试验和错误,我才弄清楚了这一点。下面的代码用于调用SimpleTrip并从服务器返回适当的响应。我的TripLegs arg对于SOAP所寻找的东西仍然不是100%正确的,但代码和调用它的方式是。

var url = 'http://prime.promiles.com/Webservices/v1_1/PRIMEStandardV1_1.asmx?wsdl'; 
     var credentials = { Username:  "xxxxx", 
          Password:  "xxxxxx", 
          CompanyCode: "xxxxx" 
          }; 

     var simpleTrip = { 
          AvoidTollRoads:  false, 
          BorderOpen:   true, 
          RoutingMethod:  "PRACTICAL", 
          VehicleType:  "Tractor2AxleTrailer2Axle", 
          TripLegs:   [{Location: {LocationText: "77611"}}, 
               {Location: {LocationText: "90210"}}] 
         } 

     args = {c: credentials, BasicTrip: simpleTrip}; 

     Soap.createClient(url, function(err, client) { 
      console.log(err); 
      console.log(simpleTrip); 
      client.RunSimpleTrip(args, function(err, result, raw, soapHeader) { 
       console.log(result); 
       //console.log(err.root); 
       console.log(err.root.Envelope); 
      }) 
     }); 
+0

这段代码是否足以构成客户端SOAP调用?或者我需要制作一个服务器,就像他们在文档中做的一样 –