AngularJS - intégration du service SOAP avec le modèle AngularJS

je suis un développeur Flex expérimenté qui apprend AngularJS. C'est tellement difficile!!!

en tout cas, j'essaie de faire un appel de service à mon serveur d'arrière-plan (sur le même domaine) via une requête SOAP WSDL, et de remplir les données avec un objet modèle AngularJS. J'essayais Ajax, mais j'avais du mal à récupérer les données. Je pense qu'il y a quelque chose qui ne va pas avec la façon dont j'ai créé l'étiquette de savon. Je recevais une réponse positive, mais pas de données.

après n'avoir pas été en mesure de comprendre la méthode Ajax, je suis tombé sur soapclient.js et a trouvé que c'était extrêmement facile, avec moins de code que Ajax. soapclient.js fait la plupart du travail pour vous, similaire à la méthode Ajax, qui fait beaucoup moins de code. En outre, en utilisant soapclient.js je suis capable de faire L'appel SOAP et aussi obtenir des données de retour la réponse formatée XML.

http://javascriptsoapclient.codeplex.com

Mon problème est que je suis en train utiliser AngularJS pour Dumper la réponse XML dans un objet modèle AnularJS. Je ne sais pas comment mettre en place le projet AngularJS pour ce que je fais, mais je voudrais vraiment savoir la meilleure méthode afin de garder ce que je travaille sur découplé. J'ai cherché Google comme fou, mais la plupart des exemples semblent trop compliqué pour un débutant.

Voici ce que j'ai:

<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>

maintenant, le service SOAP renvoie les données comme ceci:

 <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>

qu'est-Ce que l' "bonne" façon dans AngularJS pour faire l'appel de service, en supposant que la façon dont je l'ai fait est ok, si pas me laisser savoir la meilleure façon, et puis dans le résultat, Comment puis-je boucle à travers les données dans la réponse XML et le parse dans un objet modèle angulaire? Je veux éventuellement utiliser ces données dans un DataGrid.

Toute aide sera très appréciée.

19
demandé sur anad2312 2013-07-05 17:50:53

3 réponses

deux ans de retard, mais j'ai construit un module angulaire spécifiquement pour travailler avec les services SOAP web qui est sur GitHub.

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

Voici un blog sur la façon de l'utiliser: http://mcgivery.com/soap-web-services-angular-ionic/

Longue histoire courte, il permet de faire quelque chose comme ceci:

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

})
18
répondu Andrew McGivery 2015-03-31 14:34:29

je suppose que la meilleure façon serait de l'implémenter comme un $ interceptor http. Je l'ai fait dans notre projet et ça a bien fonctionné parce que les appels $http angulaires restent les mêmes.

Ceci est un lien vers le fournisseur que j'ai créé pour notre projet : http://jsfiddle.net/gqp9m/

J'ai fait du copier-coller de la bibliothèque soapclient et je l'ai transféré dans un fournisseur. J'ai aussi changé un peu de syntaxe pour que le code passe jsHint. La plupart de la fonction modifiée sont commentés avec des notes de documentation. Il nécessite également jQuery (pour le $.la fonction parseXML - vous pouvez la reformuler pour supprimer la dépendance dans jQuery).

la plus grande différence est que mon code ne charge pas la wsdl sur la première requête, mais a plutôt besoin que vous la mettiez en cache avant de faire n'importe quel appel, comme ceci:

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);
    });
}]);

savon est l'injection savon-intercepteur instance. Vous appelez le wsdl et ensuite appeler savon.setWSDL le passant l'url de base et le WSDL résolu. Notez également l' isJSON argument passé à l'appel $ http. C'est là parce que par défaut mon code traite chaque appel comme une demande SOAP. C'est ce que les intercepteurs de le faire. isJSON:true vous permettra d'utiliser $http que dieu a destiné ;)

Après l'appel de setWSDL il suffit d'appeler $http comme vous le faites toujours:

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

s'il vous plaît rappelez-vous que ce code a été écrit pour notre projet et il n'est pas un projet open source ou quelque chose. Il peut nécessiter un certain niveau d'entretien ou de remaniement avant que vous puissiez l'utiliser, mais c'est un bon début.

8
répondu Yair Tavor 2014-01-08 06:49:40

vous pouvez y parvenir sans bibliothèques SOAP wsdl. importez votre wsdl dans SOAP UI et copiez l'enveloppe. ci-dessous est l'exemple dans AngularJS comment gérer le service Web SOAP.

Service:

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

appeler le service et gérer la sortie XML. vous pouvez capturer les attributs que vous souhaitez:

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;
});
0
répondu Raj Malakpet 2018-09-11 21:01:07