Transmettre un ficher xml à un webservice
sync
Membre
Bonjour,
Je suis à la recherche d'une solution pour questionner un webservice .net d'exemple en construisant un fichier xml et en l'envoyant à travers un POST.
J'ai un début de solution mais pour la suite je sèche.
Voilà à quoi doit ressembler la requête:
et voici la réponse que je dois obtenir de ce webservice:
Si quelqu'un pourrait me dépanner ce serait bien aimable de sa part... :brule:
Bonne soirée
Anthony
Je suis à la recherche d'une solution pour questionner un webservice .net d'exemple en construisant un fichier xml et en l'envoyant à travers un POST.
J'ai un début de solution mais pour la suite je sèche.
- (void)transmitXMLRequest:(NSData *)data<br />{<br />Â NSMutableData *responseData;<br />Â NSURL *webServiceURL = [NSURL URLWithString:@"http://www.webservicex.net/barcode.asmx"];<br />Â NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:webServiceURL];<br />Â [urlRequest setHTTPMethod:@"POST"];<br />Â [urlRequest setValue:@"text/xml" forHTTPHeaderField:@"Content-type"];<br />Â [urlRequest setValue:@"http://www.webserviceX.net/Code39" forHTTPHeaderField:@"SOAPAction"];<br /><br />Â [urlRequest setHTTPBody:data];<br />Â Â <br />Â NSURLConnection *connectionResponse = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];<br />Â if (!connectionResponse) {<br />Â Â NSLog(@"Failed to submit request");<br />Â } else {<br />Â Â NSLog(@"Request submitted");<br /> responseData = [[NSMutableData alloc] init];<br />Â }<br />}
Voilà à quoi doit ressembler la requête:
POST /barcode.asmx HTTP/1.1<br />Host: www.webservicex.net<br />Content-Type: text/xml; charset=utf-8<br />Content-Length: length<br />SOAPAction: "http://www.webserviceX.NET/Code39"<br /><br /><?xml version="1.0" encoding="utf-8"?><br /><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><br />Â <soap:Body><br />Â Â <Code39 xmlns="http://www.webserviceX.NET"><br />Â Â Â <Code>string</Code><br />Â Â Â <BarSize>int</BarSize><br />Â Â Â <ShowCodeString>boolean</ShowCodeString><br />Â Â Â <Title>string</Title><br />Â Â </Code39><br />Â </soap:Body><br /></soap:Envelope>
et voici la réponse que je dois obtenir de ce webservice:
HTTP/1.1 200 OK<br />Content-Type: text/xml; charset=utf-8<br />Content-Length: length<br /><br /><?xml version="1.0" encoding="utf-8"?><br /><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><br />Â <soap:Body><br />Â Â <Code39Response xmlns="http://www.webserviceX.NET"><br />Â Â Â <Code39Result>base64Binary</Code39Result><br />Â Â </Code39Response><br />Â </soap:Body><br /></soap:Envelope>
Si quelqu'un pourrait me dépanner ce serait bien aimable de sa part... :brule:
Bonne soirée
Anthony
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
J'arrive désormais à envoyer ce fichier xml au server .net qui reconnait le fichier et qui me renvoie une résponse "juste".
Voici le code que j'utilise pour obtenir le résultat désiré:
Méthode qui construit le fichier xml à transmettre:
Méthode de transmission du fichier xml au serveur .net
Voici un tcpdump de la réponse du service .net:
Ok à l'aide de ce tutoriel
http://www.awprofessional.com/articles/printerfriendly.asp?p=468381&rl=1
Maintenant ce qu'il me manque parser le fichier xml reçu.
J'ai quelque problème d'encodage apparemment...
Une petite aide pour retrouver mes beaux "<" en lieux et place de ces caractères provenant de l'html "<" ???????
PS: J'ai changé de webservice mais toujours hosté chez webserviceX.net
J'arrive jusqu'à là après je sèche!!!
Si tu veux plus d'infos sur l'utilisation de Xpath, je peux t'aider. Si j'ai rien compris à ta question ... je peux pas t'aider (enfin si, je peux si je comprends).
http://weblog.scifihifi.com/2004/06/10/unescaping-xml-entities-in-nsstrings/
Il ne reste plus qu'à parser le fichier xml qui est le suivant:
Une petite soluce pour récupérer en NSString "<Location>Sion, Switzerland (LSGS) 46-13N 007-20E 481M</Location>" ?
Allez bon week end
@soap:Body/GetWeatherRespons/GetWeatherResult/CurrentWeather/Location en prenant comme NSXMLNode de départ ton rootElement.
Pour tester un XPath, j'utilise AquaXpath (dispo sur macupdate.com), c'est assez pratique.
Recommandation W3C de XPath 1.0:Â http://www.w3.org/TR/xpath
- soit de ne pas te répondre ce qu'il devrait, en échappant des caractères qu'il ne devrait pas échapper
- soit encapsuler un document XML dans un autre document XML mais sans en échaper la totalité des caractères (< mais pas de >, c'est pas cohérent)
Donc pour moi c'est le webservice qui s'amuse avec tes pieds...
Merci pour ta réponse mais je ne sais pas comment utiliser xpath dans un fichier xml:
Ce que je fais:
Mais maintenant si je veux attribuer la location à tempLocation je fais comment ?
Bonne journée
Rassure toi, ça devrait pas être trop dur. Il suffit que tu lises ma première réponse dans ce fil et hop! tu as la méthode appropriée pour trouver un noeud xml avec XPath.
Â
Oulala ça se complique. Est-ce que tu veux vraiment "attribuer" une valeur à un noeud de tempLocation ou récupérer la valeur d'un noeud ? Cé pas pareil ! Dans le premier cas, la méthode que je t'ai signalée suffit. Dans le deuxième, c'est (un peu) plus compliqué.
Et aussi plus au il y a la réponse à ma question...
héhé
Je vais aller me réveiller !!
Bonne journée et désolé :-\\
Suite du feuilleton des services web... tout fonctionne je butte au niveau du parsing xml
Je voudrais récupérer les valeurs longitude et latitude du fichier xml suivant:
Mais le problème c'est que latitude et longitude ne sont pas toujours au même endroit !
Des fois il se trouve à un autre endroit dans le réponse du serveur:
Par contre multiRef à toujours un id de 4...
Quelqu'un connaà®trait-il un solution miracle ???
Bonne journée
Aujourd'hui un nouveau problème... héhé pour changer
Je fais appel à 3 webservices à la suite.... qui sont complémentaires, le problème c'est que je n'arrrive pas à savoir quand un appel à un webservice est terminé...
chaque webservices est appelé de cette façon:
Enfin on peut savoir quand le chargement de la connexion est terminée grâce à cette méthode déléguée
Pour l'instant ce que je fais c'est que j'appel mon 2ème webservice dans la méthode déléguée connectionDidFinishLoading mais ce n'est pas satisfaisant.
Donc il faudrait trouver une façon pour ne pas lancer le 2ème webservice tant que l'on a pas fini le chargement du 1er webservice et ainsi de suite à l'aide d'une méthode...
Quelqu'un pourrait-il m'aider ???
Salutations
Anthony
En particulier cette partie j'aimerai que
ne soit appelé que quand l'appel au webservice est terminé sinon il va me renvoyer des valeures nulles car la méthode getValues va récupérer le dictionnaire de résultat de mon appel au webservice
Sais pas si c'est un peu plus clair
bonne journée
Pourquoi ce n'est pas satisfaisant ?
En utilisant sendSynchronousRequest:returningResponse:error: de NSURLConnection,
tu évites l'utilisation du delegate, et tu es sûr qu'au retour de la méthode,
la réponse (ou l'éventuelle erreur) est arrivée avant d'enchainer sur la 2ème connexion.
Mais, en utilisant cette méthode, tu bloques le thread principal de ton appli tant que la connexion
n'est pas terminée. Ceci provoque le figeage de l'interface, voire la roue-de-la-mort si le
webservice est trop long à répondre.
L'utilisation d'une connexion asynchrione (tournant dans un thtread séparé) et d'un delegate est
pour moi la solution la plus élégante, et surtout, la plus MACOSX.
.
Oui c'est clair le delegate marche très bien. Le problème c'est qu'apparemment depuis ce delegate(connectionDidFinishLoading) si j'appelle ma fonction : rien ne se produit.
(voici ma méthode setPicture)
En effet, moi je te réponds : que doit-il se produire ?
De toute façon, en passant par la méthode asynchrone, la connexion se fait dans un thread séparé.
Donc, le delegate est exécuté aussi dans ce thread séparé.
Donc [self setPicture:url] est exécuté dans le thread séparé.
Donc, toute méthode mettant à jour l'UI ne fonctionnera pas !
Donc, je suppose que [photoContact setImage:imageFromBundle] met à jour un NSImageView, mais le raffraichissement à l'écran ne se fera pas.
Pour solutionner ça, je te conseille d'appeler [self setPicture:url] dans le thread principal en faisant :
.
Merci pour la résponse.... effectivement le but étant de mettre à jour une NSImageView. J'ai bien utiliser performSelectorOnMainThread mais toujours rien pas de mise à jour de l'image il doit il y a voir un petit truc que je loupe
Bonne soirée
;D
J'aimerai récupérer ça dans un array mais je me retrouve toujours avec un nsarray vide
J'ai essayé les xpath suivants:
Voici le fichier xml...
Voilà maintenant j'obtiens cela
et je veux récupérer le #id0 comment faire ?
Résonse
Résonse