Soap wsdl renvoi tableau multidimentionnel xml

Fermé
samfp123 Messages postés 3 Date d'inscription mercredi 24 janvier 2018 Statut Membre Dernière intervention 7 février 2018 - 25 janv. 2018 à 15:39
samfp123 Messages postés 3 Date d'inscription mercredi 24 janvier 2018 Statut Membre Dernière intervention 7 février 2018 - 7 févr. 2018 à 13:38
Bonjour,
J'ai besoin d'un très simple et basique exemple d'utilisation SOAP avec php pour créer un service web avec le résultat sera en format XML.
J'ai trouvé une solution utilisant nusoap.php mais elle me renvoi une chaine de caractère.

Voila un petit exemple:
J'ai une table pr_processus(id,refernce,date,libelle)
Je veut créer un service web qui renvoi la liste des processus d'une date définie (le résultat est composé d'une ou plusieurs ligne ou bien rien si rien n'est trouvé)
Le code coté client est comme-çi:

<?php
require_once "lib/nusoap.php";
$client = new nusoap_client("http://localhost/sttpb/services/getprocessus.php");

$error = $client->getError();
if ($error) echo "<h2>Constructor error</h2><pre>" . $error . "</pre>";

$result = $client->call("getprocessus", array("date"=>"jj/mm/yyyy"));

if ($client->fault) {
echo "<h2>Fault</h2><pre>";
print_r($result);
echo "</pre>";
}
else {
$error = $client->getError();
if ($error) echo "<h2>Error</h2><pre>" . $error . "</pre>";
else {
echo "<h2>Result:</h2>";
echo $result;
}
}


Au coté serveur, j'ai créer un fichier getprocessus.php comme suit:

<?php
require_once "lib/nusoap.php";

function getprocessus($date){
$db=new PDO('mysql:host=localhost;dbname=logidb', 'root', '',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$query="select id,reference,libelle from pr_processus";
if(isset($date))
if($date!=""){
$stm=$db->prepare($query." where date=?");
$stm->execute($date)
}
else{
$stm=$db->prepare($query);
$stm->execute()
}
$result=$stm->fetchall(PDO::FETCH_ASSOC);

return join(",",$result);
}

$server = new soap_server();
$server->register("getprocessus");
$server->service($HTTP_RAW_POST_DATA);


?>


Juste là tout ça marche bien et le client obtient une chaine de caractère, la réponse SOAP est comme-çi:

<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getProdResponse xmlns:ns1="http://tempuri.org">
<return xsi:type="xsd:string">
1,p1/2018,processus1,2,p2/2018,processus2,3,p3/2018,processus3
</return>
</ns1:getProdResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Le problème c'est que je veut le résultat sera renvoyé sous format XML et pas une chaine, d'après que j'ai compris de mes recherche je doit utiliser WDSL. Comment procéder ?
Quelqu'un peut m'aider?
et merci
A voir également:

1 réponse

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 251
25 janv. 2018 à 16:33
Salut,

ce que tu présentes est du xml (le xml n'est qu'une chaîne de caractères formatté).

naga
0
samfp123 Messages postés 3 Date d'inscription mercredi 24 janvier 2018 Statut Membre Dernière intervention 7 février 2018
5 févr. 2018 à 13:07
Merci de me répondre,
mais je veut que le résultat sera sous la forme
<response>
<processus>
<id>1</id>
<refernce>p1/2018</refernce>
<libelle>processus1</libelle>
</processus>
<processus>
<id>2</id>
<refernce>p2/2018</refernce>
<libelle>processus2</libelle>
</processus>
<processus>
<id>3</id>
<refernce>p3/2018</refernce>
<libelle>processus3</libelle>
</processus>
</response>

J'ai essayé de créer cette chaine avec deux boucle for imbriqué mais lorsque j'affiche la réponse les symboles "<" et ">" sont remplacés par les code html & < et &>
J'ai constaté de mes recherche que je doit créer un type complexe wsdl, je l'ai essayé mais je n'arrive pas à lire le resultat
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 251
5 févr. 2018 à 13:54
c'est normal, tes caractères sont échappé pour éviter que tout pète (interprétation d'un code qui ne le devrait pas).
Avec soap ta communication se fera sous le format xml (comme tu l'as remarqué), ce qui implique que si tu souhaites passer aussi du contenu xml dans une réponse, il va falloir que gère son échappement.

Complexe pas complexe, beaucoup ont l'habitude de donner des explications ou tutoriel qui découragent mais avec un autre angle de vue c'est plus simple. dans ton cas :

<return xsi:type="xsd:string">
1,p1/2018,processus1,2,p2/2018,processus2,3,p3/2018,processus3
</return>


perso ce format semble être suffisant -> c'est toujours la même chose : tu dois interpréter une réponse. Or dans ton cas tu gères la génération et l'interprétation de la réponse, je ne vois donc pas pourquoi tu veux t'embêter à changer ce format mais passons.


Pour répondre à la "question " remplacés par les code html & < et &> , la raison pour laquel on va avoir ce format c'est simplement de manière à ce que ton navigateur ne le considère pas qutrement que comme une chaine de caractères (ce qui doit être le cas vu que c'est à ton process qu'il est destiné).

Et donc, tu n'as plus qu'a retirer l’échappement de caractères, soit remplacer dans ton texte &<; par < etc.

Une autre solution est de d'utiliser la section CDATA, quelques infos :

https://en.wikipedia.org/wiki/CDATA



Mais sans voir ni le code qui génère la réponse, ni celui qui va l interpréter, je ne peux pas t'aider plus


naga
0
samfp123 Messages postés 3 Date d'inscription mercredi 24 janvier 2018 Statut Membre Dernière intervention 7 février 2018
7 févr. 2018 à 13:38
Merci
0