AngularJS - Интеграция сервисов SOAP с моделью AngularJS
Я опытный разработчик 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 для того, что я делаю, но мне бы очень хотелось узнать лучший метод, чтобы сохранить то, что я работаю над развязанными. Я искал Google как сумасшедший, но большинство примеров кажутся слишком сложными для новичков.
Вот что у меня есть:
<html>
<head>
<script language="JavaScript" type="text/javascript" src="jquery-1.10.1.js"></script>
<script language="JavaScript" type="text/javascript" src="soapclient.js"></script>
<script type="text/javascript">
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);
}
</script>
</head>
<body>
<form>
<input type="button" value="Click Here to Call Web Service" onClick="getData()" style="width: 192px">
</form>
<div id="result">Result?</div>
</body>
</html>
Теперь служба SOAP возвращает данные следующим образом:
<return>
<contents>
<eftAcctType>S</eftAcctType>
<id>
<djNumber>201-16-39063</djNumber>
<djSequence>1</djSequence>
</id>
<payeeAddrLine1>124 Agate Drive</payeeAddrLine1>
</contents>
<contents>
<eftAcctType/>
<id>
<djNumber>201-16-39201</djNumber>
<djSequence>1</djSequence>
</id>
<payeeAddrLine1>c/o Kevin Martinez, Attorney at Law</payeeAddrLine1>
</contents>
<contents>
<eftAcctType>C</eftAcctType>
<id>
<djNumber>201-16-38561</djNumber>
<djSequence>1</djSequence>
</id>
<payeeAddrLine1>1360 South Highway 191</payeeAddrLine1>
</contents>
<status>0</status>
</return>
Что такое "правильный" способ в AngularJS для вызова службы, предполагая, что я сделал это нормально, если не дать мне знать наилучший способ, а затем в результате, как я прокручиваю данные в ответ XML и проанализировать его в объект модели Angular? В конечном итоге я хочу использовать эти данные в DataGrid.
Любая помощь будет очень оценена.
Ответы
Ответ 1
Два года спустя, но я создал модуль Angular специально для работы с веб-службами SOAP, находящимися в GitHub.
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;
});
})
Ответ 2
Я думаю, лучший способ - реализовать его как $http interceptor. Я сделал это в нашем проекте, и он отлично поработал, потому что angular $http calls остались прежними.
Это ссылка на провайдера, созданного мной для нашего проекта: http://jsfiddle.net/gqp9m/
Я сделал некоторую копию-вставку из библиотеки soapclient и перенес ее в поставщика. Я также немного изменил синтаксис, поэтому код передаст 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);
});
}]);
мыло представляет собой инъецируемый мыльный перехватчик. Вы вызываете wsdl, а затем вызываете soap.setWSDL, передавая ему базовый url и разрешенный wsdl. Также обратите внимание на аргумент isJSON, переданный на вызов $http. Это происходит потому, что по умолчанию мой код обрабатывает каждый вызов как запрос SOAP. Что делают перехватчики. isJSON: true позволит вам использовать $http как предназначенный бог;)
После вызова setWSDL просто вызовите $http, как вы всегда:
$http.get('http:/www.myveryfakedomain.com/CRMAPIWS74/action').then(function(result){
// do something...
});
Помните, что этот код был написан для нашего проекта, и это не поддерживаемый проект с открытым исходным кодом или что-то в этом роде. Возможно, вам понадобится некоторый уровень обслуживания или рефакторинга, прежде чем вы сможете его использовать, но это хороший старт.