Bonjour,
Voila je rencontre un petit problème avec mon code.
J'utilise angular-soap.js et xml2Json en librairies. J'ai des web services en php que j'appel via mon fichier wsdl. Ici, la méthode getExternalI. Je déclare ce web service dans ma factory('testService') puis je l'appelle dans le controller avec testService.getExternalI().
Cependant, je n'arrive pas à passer ma réponse XML dans le paramètre $http.get pour parser cette réponse dans mon controller.
Ma factory fonctionne bien et génère correctement une réponse XML, de même que mes quelques lignes pour parser fonctionne également avec un fichier plat.
Auriez-vous une idée pour que je puisse avancer ? Je rame depuis 2 jours maintenant, et j'ai besoin de ça pour passer à la suite du projet.
angular.module('angularSoap', [])
.factory("$soap",['$q',function($q){
return {
post: function(url, action, params){
var deferred = $q.defer();
//Create SOAPClientParameters
var soapParams = new SOAPClientParameters();
for(var param in params){
soapParams.add(param, params[param]);
}
//Create Callback
var soapCallback = function(e){
if(e.constructor.toString().indexOf("function Error()") != -1){
deferred.reject("An error has occurred.");
} else {
deferred.resolve(e);
}
}
SOAPClient.invoke(url, action, soapParams, true, soapCallback);
return deferred.promise;
}
}
}]);
angular.module('myApp', ['angularSoap'])
.factory("testService", ['$soap',function($soap){
var base_url = "http://localhost/ws_ldap/InputServer.php";
return {
getExternalI: function(){
return $soap.post(base_url, "getExternalI");
}
}
}])
.controller('MainCtrl', function ($scope, testService, $http) {
$http.get("testService.getExternalI()",
{
transformResponse: function (cnv) {
var x2js = new X2JS();
var aftCnv = x2js.xml_str2json(cnv);
return aftCnv;
}
})
.then(function (response){
console.log(response);
$scope.myData = response.data;
});
});
Passer ma réponse XML 'testService.getExternal()' en paramètre d'$http.get pour pouvoir parser cette réponse.
Dans l'état actuel du code, l'erreur que j'obtient est "
GET http://localhost/ws_ldap/testService.getExternalI()
404 Not Found
Bonjour,
enleves les guillements autour de testService.getExternalI() dans :
...
$http.get("testService.getExternalI()", // <= guillemets ???
{
transformResponse: function (cnv) {
var x2js = new X2JS();
...
Merci d'avoir répondu,
alors cela ne me mets rien concernant le console.log(response), j'obtient avant celà :
Error: [$http:badreq] http://errors.angularjs.org/1.5.0/$http/badreq?p0=%7B%22item%22%3A%7B%22item%22%3A%22beny%20Hooper%22%7D%7D
(beny Hooper à la fin de l'erreur étant le dernier row de mon résultat XML)
il charge le wsdl, il effectue également la requête puis plante.
PS : petite précision, lorsque j'utilisais directement mon controller comme cela, j'obtenais bien la réponse mais seulement le dernier row de la réponse. Si ça peut t'aider dans ta démarche, voici le controller que j'utilisais avant.
.controller('MainCtrl', function($scope, testService) {
testService.getExternalI().then(function(response){
$scope.myData = response;
console.log(response);
});
Ok
...
.controller('MainCtrl', function ($scope, testService, $http) {
$scope.myData = null;
testService.getExternalI().then(
function(reponse){
// reponse correspond au e de deferred.resolve(e) de $soap
// es tu bien sur de la forme que doit avoir la reponse de ton 'soap' ? l'erreur peux venir de là ? non ?
var x2js = new X2JS();
$scope.myData = x2js.xml_str2json(reponse);
},
function(reponse){
console.log(reponse); // <= An error has occurred. du deferred.reject(...) de $soap
});
}
Bonjour,
J'ai pas mal tâtonné, et j'ai déjà essayé cela, ça me renvoit "angular.js:13236 Error: [$http:badreq]". J'imagine qu'il ne comprend pas ce que je lui place en paramètre...
Merci d'avoir pris le temps de me répondre, si tu as d'autres idées n'hésite pas, je suis vraiment dans l'impasse actuellement ! :/
testService.getExternalI() retourne une promesse, pas une chaine de caractère il y a là aussi un probleme
essayes :
...
.controller('MainCtrl', function ($scope, testService, $http) {
testService.getExternalI().then(
function(reponse){
$http.get(reponse,
{
transformResponse: function (cnv) {
var x2js = new X2JS();
var aftCnv = x2js.xml_str2json(cnv);
return aftCnv;
}
})
.then(function (response){
console.log(response);
$scope.myData = response.data;
});
},
function(reponse){
console.log(reponse); // <= An error has occurred.
});
}
Le fichier WSDL charge bien, la réponse de mon web service est correctement chargé sous format XML.
Okay, alors là j'arrive à afficher quelque chose à l'écran, sans erreur en faisant un {{data}}, jobtient :
"
Nom
{"sourcetext":"[object Object]\n^","__text":"Erreur d'analyse XML : erreur de syntaxe\nEmplacement : http://localhost/SOAP-CLIENT(loadXM_badParsing)/index.html\nNuméro de ligne 1, Colonne 1 :"}"
En faisant un console.log de reponse j'obtient uniquement le dernier row de mon XML.
Merci de prendre le temps de m'aider, j'ai déjà avancé puisque j'affiche quelque chose désormais!
Okay, j'ai vérifié le fichier XML, il y a une anomalie dans le format XML. J'ai plus qu'à me plancher là dessus avant de revenir sur angularJS...
Merci du coup de main, tu m'as aidé à comprendre mon erreur,
Bonne soirée!
encore merci!!=)
tu peux copier coller un console.log de reponse que je vois la gueule que cela a ? Ton xml est bien formé ? 'Erreur d'analyse XML : erreur de syntaxe' ?
peut être faire
$scope.myData = JSON.parse(x2js.xml_str2json(reponse));
En testant la dernière ligne de code que tu m'as proposé, j'obtient cela :
Error: JSON.parse: unexpected character at line 1 column 2 of the JSON data
@http://localhost/SOAP-CLIENT(loadXM_badParsing)/js/controlerNavigation.js:55:27
e/
Pour le console.log de reponse, voici :
item
Object { item="Jill Hooper"}
item
"Beny Hooper"
Par contre, j'ai une question, dans firebug sur firefox, dans la console, si je vais dans l'onglet XML de ma réponse, j'ai un XML bien formaté. Cependant, si je vais dans l'onglet à côté "Réponse" J'obtient un XML mal formé.
Cette erreur vient-elle d'angularJS ? Il reprend le XML de mon web service (bien formaté) puis le transmet en réponse (mal formé) ? Auquel cas ma factory pour consommé mes web services est peut être éronné ?
Je ne pense pas, ton xml doit être vraiment mal formé. balise non fermée, caractère non protégé (entités html, <![CDATA[ ]]>) ou invalide mauvais encodage (utf8, iso...) , un espace qui traine en début de fichier, va savoir...
item
Object { item="Jill Hooper"} <= Ca c'est bizarre par exemple
item
"Beny Hooper"
Pour avoir testé mes web services avec SOAP-UI (et au vu de la réponse dans l'onglet XML de mon navigateur), j'ai un format correct qui est envoyé de mon web service. Ceci étant, j'imagine que soap-angular.js ne récupère pas correctement la réponse du web service :/ puisque la réponse comporte une erreur à la ligne 6. De ce fait, XML2JSON ne fonctionne pas non plus puisque la réponse n'est pas valide, non ?
Alors pour la réponse, j'ai déjà testé XML2JSON à part, où j'ai placé mes informations issue de mon web service dans un fichier plat que j'appelle avec $http.get(monfichier.xml, parsing) et cela donnait un JSON particulièrement moche mais valide puisque j'arrivais à afficher les informations à l'écran à partir de ce même fichier.
Je pense que mon soucis vient désormais de la récupèration du résultat du web service. (puisque le XML est correct, mais la réponse malforme le XML). J'ignore quelle solutions il me reste pour avancer récupèrer du XML et l'afficher en JSON ? Si tu as une idée je suis preneur, car je suis pas suffisament compétent pour comprendre d'où vient cette erreur XML :/ Je dois peut être repasser sous Jquery & Ajax, je vais moins galèrer ?
Merci d'avoir pris le temps de me répondre, si ça tenais qu'à moi je t'offrirai une bière (ou un coca), mais on peux pas trinquer ici... arf!
Bonne soirée,
A+
Angular utilise une version 'lite' de jquery en integré, et si tu as chargé jquery dans ta page, il remplace le lite par le 'regular' de lui même
D'accords, ceci étant j'ai vu (+) d'exemples avec Jquery pour le parsing et l'appel de web service SOAP il doit avoir (+) d'exemple également.
Je vais peut être tenter de modifier le php comme tu dis, c'est la meilleure solution à mon petit projet je pense =)
Encore merci pour toute l'aide apporté ;-)
bonne soirée, A+
Yop,
Finalement, après avoir jeté un oeil sur mon exemple à part de parsing (xml2json) avec un fichier plat, j'obtient bien une réponse mal formé du XML plat (une erreur) mais j'arrive tout de même à obtenir mon fichier JSON et a afficher mes données. Je vais continuer à essayer de faire marcher le code angularJS. L'erreur doit venir de la syntaxe $scope.myData = x2js.xml_str2json(reponse)
d'où l'erreur d'affichage de mon ng-repeat data in my data qui me renvoit une erreur.
J'avais une question, comment se fait-il que mon script (sans xml2json) arrive à retourner sous format JSON le dernier row de ma réponse XML ? Cela vient de ma libraire angular-soap.js ou le code angularjs fait naturellement cela ?
Bonjour,
Rien à voir avec Angular, comme je t'ai dit cette lib utiise naturellement jquery ( au pire une version 'lite' intégrée si tu n'as pas toi même au mieux chargé la version 'full' dans ta page). Si tu vas voir la documentation de jquery et en particulier la partie consacrée à Ajax au paragraphe concernant le dataType. jquery reconnait le type de réponse basé sur les headers http (mime type) de cette réponse et parse les données de façon adequate pour l'utilisation dans le javascript. D'ailleurs je me pose la question de l'utilité de x2js ...
D'accords, merci pour l'éclaircissement sur ce sujet ! :)
Passez une bonne journée,
BenyBenop
Je viens de tilter sur la fin de ta réponse. En effet, j'ignorais à vrai dire s'il était nécessaire d'utiliser X2JS à la base, j'étais parti du constat que j'obtenais que le dernier résultat de ma réponse XML et qu'il s'agissait d'un problème de parsing mais si ce que tu dis est vrai, je me suis peut être égaré en me dirigeant vers cette idée là. Je vais essayer de creuser sans X2JS, voir ce que cela donne.
Merci pour toute l'aide apporté !
Bonne journée