AngularJS – 与AngularJS模型的SOAP服务集成

我是一名经验丰富的Flex开发人员,正在学习AngularJS。 这太令人困惑了!

无论如何,我试图通过SOAP WSDL请求对我的后端(在同一域)服务器进行服务调用,并使用AngularJS模型对象填充数据。 我正在尝试使用Ajax但是在获取实际数据方面存在一些问题。 我认为创建SOAP标记的方式有问题。 我收到了成功的回复,但没有数据。

在无法弄清楚Ajax方法之后,我遇到了soapclient.js并发现它非常简单,代码比Ajax少。 soapclient.js为您完成大部分工作,类似于Ajax方法,它可以减少代码。 另外,使用soapclient.js我能够进行SOAP调用,并且还可以获取XML格式的响应数据。

http://javascriptsoapclient.codeplex.com

我的问题是我正在尝试使用AngularJS将XML响应转储到AnularJS模型对象中。 我不知道如何设置AngularJS项目我正在做什么,但我真的想知道最好的方法,以保持我正在解决的工作。 我一直在疯狂地搜索谷歌,但大多数例子对初学者来说似乎过于复杂。

这是我有的:

     function getData() { var url2 = "https://myService"; var pl = new SOAPClientParameters(); pl.add("arg0", false); SOAPClient.invoke(url2, "methodToCall", pl, true, getDataCallback); } function getDataCallback(r, soapResponse) { alert(r.contents.payeeMailName); }    
Result?

现在,SOAP服务返回如下数据:

    S  201-16-39063 1  124 Agate Drive     201-16-39201 1  c/o Kevin Martinez, Attorney at Law   C  201-16-38561 1  1360 South Highway 191  0  

在AngularJS中进行服务调用的“正确”方式是什么,假设我这样做的方式没问题,如果不是让我知道最好的方法,那么在结果中,我如何在XML响应中循环数据并将其解析为Angular模型对象? 我最终想在DataGrid中使用这些数据。

任何帮助都感激不尽。

两年后,我已经构建了一个专门用于处理GitHub上的SOAP Web服务的Angular模块。

https://github.com/andrewmcgivery/angular-soap

这是一篇关于如何使用它的博客文章: http : //mcgivery.com/soap-web-services-angular-ionic/

长话短说,它允许你做这样的事情:

 angular.module('myApp', ['angularSoap']) .factory("testService", ['$soap',function($soap){ var base_url = "http://www.cooldomain.com/SoapTest/webservicedemo.asmx"; return { HelloWorld: function(){ return $soap.post(base_url,"HelloWorld"); } } }]) .controller('MainCtrl', function($scope, testService) { testService.HelloWorld().then(function(response){ $scope.response = response; }); }) 

我想最好的方法是将它实现为$ http拦截器 。 我在我们的项目中做到了它并且效果很好,因为角度$ http调用保持不变。

这是我为项目创建的提供者的链接: http : //jsfiddle.net/gqp9m/
我从soapclient库中做了一些copy-paste并将其移到了一个提供者中。 我也改变了一些语法,所以代码将通过jsHint。 大多数修改过的函数都附有文档说明。 它还需要jQuery(对于$ .parseXML函数 – 你可以重构它来删除jQuery中的依赖)。

最大的区别是我的代码没有在第一次请求时加载wsdl,而是需要你在进行任何调用之前对其进行缓存,如下所示:

 myModule.service(['myModule.soap-interceptor', function(soap){ $http.get('http://www.myveryfakedomain.com/CRMAPIWS74?wsdl', { isJSON: true }).then(function(result){ soap.setWSDL('http:/www.myveryfakedomain.com/CRMAPIWS74', result.data); }); }]); 

soap是注入的soap-interceptor实例。 你调用wsdl然后调用soap.setWSDL传递它的基本URL和解析的wsdl。 还要注意传递给$ http调用的isJSON参数。 这是因为默认情况下我的代码将每个调用视为SOAP请求。 这就是拦截器的作用。 isJSON:true将允许你使用$ http作为上帝的意图;)

在调用setWSDL后,只需调用$ http,就像你总是这样:

 $http.get('http:/www.myveryfakedomain.com/CRMAPIWS74/action').then(function(result){ // do something... }); 

请记住,此代码是为我们的项目编写的,它不是受支持的开源项目或其他东西。 在使用它之前可能需要一定程度的维护或重构,但这是一个好的开始。

您可以在没有任何SOAP wsdl库的情况下实现此目的。 将wsdl导入SOAP UI并复制信封。 下面是AngularJS中如何处理SOAP Web服务的示例。

服务:

 app.service('service', function($http) { this.soapService = function(_anydata) { var _url = 'soap_service_endpoint_url'; var soapRequest = '<=== xxx ===>'; var soapAction = '<=== soap action ===>'; var headers = { 'SOAPAction': soapAction, 'Content-Type': 'text/xml; charset=utf-8' }; return $http.post(_url, soapRequest, { "headers": headers }); } }); 

调用服务并处理XML输出。 您可以捕获所需的属性:

 service.soapService(data).then(function success(response) { var _dataArr = []; $(response.data).find('Transaction').each(function() { _dataArr.push({ name: $(this).find('<=== your attributes ===>').text() }); }); return _dataArr; }, function error(response) { console.log('<==== soap error: ' + response); return response; });