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

我对SOAP一无所知,但是我的软件的重要组成部分要求我将其用于特定的Web服务。 Web服务的文档是为.net编写的,所以我更难理解我需要在这里做什么。 最重要的是他们需要authentication。

对于连接,我不需要授权,所以我可以检索描述函数的结果。 他们如下:

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)? pipe道:[function],I20151216-11:53:14.663(-8)? addListener:[Function:addListener],I20151216-11:53:14.664(-8)? on:[Function:addListener],I20151216-11:53:14.665(-8)? 暂停:[function],I20151216-11:53:14.665(-8)? 简历:[function],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)? 未定义

正如你所看到的,我能够连接。 现在摆脱我的部分就是实际调用其中的一个function。 下面是我用来尝试调用“RunSimpleTrip”的代码。 然而,当我控制台logging结果时,这是一个巨大的混乱的消息,最终在我的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); 

我希望有人对我有这样的神秘线索,或者可以指出我正确的方向,如何正确地连接这个。 任何和所有的帮助将不胜感激。

所以经过多次的反复试验,我才弄清楚了这一点。 下面的代码用于调用SimpleTrip并从服务器返回正确的响应。 我的TripLegs参数仍然不是100%正确的SOAP正在寻找,但代码和方式来调用它。

 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); }) }); 
Interesting Posts