IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Système] PHP et web services


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut [Système] PHP et web services
    Bonjour,

    Dans le cadre d'un développement, je dois envoyer des requêtes XML à un service web.Je souhaite gérer l'envoi et la réception en php. Par ailleurs je découvre les services web.
    Pour effectuer mes premiers tests j'ai tenté de communiquer avec le service web présenté dans le tuto de w3schools (http://www.w3schools.com/webservices/ws_use.asp)

    J'ai parcouru plusieurs forums et ai essayé de procéder avec des sockets pour envoyer les requêtes au service web concerné mais je reçois au mieux un message "bad request" (la plupart du temps le chargement de ma page continue indéfiniement malgré une gestion avec timeout).
    Quelqu'un aurait il déjà réalisé ce genre de développement, existe-t-il une mise en oeuvre simple avec php sans avoir à installer des librairies sur le serveur(je suis sur un hébergement free)?

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par spooky39
    J'ai parcouru plusieurs forums et ai essayé de procéder avec des sockets pour envoyer les requêtes au service web concerné mais je reçois au mieux un message "bad request" (la plupart du temps le chargement de ma page continue indéfiniement malgré une gestion avec timeout).
    Si vous nous donnez le code en question, nous pourrions y jeter un oeil

    Citation Envoyé par spooky39
    existe-t-il une mise en oeuvre simple avec php sans avoir à installer des librairies sur le serveur(je suis sur un hébergement free)?
    Avec l'extension cURL disponible chez Free pour ses deux versions de PHP (4 comme 5) ?

  3. #3
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut mon code en php
    Bonjour

    Voici le code que j'ai utilisé


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    	$rpc_page='/webservices/tempconvert.asmx';
    	$rpc_host='www.w3schools.com';
    	$rcp_port='80';
     
     
    	$timeout=8;					
     
    	$xml_rpc  = "\r\nFahrenheit=84";
     
    	$xml_rpc_length = strlen($xml_rpc);
     
    	$http_request  = 'POST '.$rpc_page.' HTTP/1.1'."\r\n";
    	$http_request .= 'Host: '.$rpc_host."\r\n";
    	$http_request .= 'Content-Type: application/x-www-form-urlencoded'."\r\n";
    	$http_request .= 'Content-length: '.$xml_rpc_length."\r\n";
    	$http_request .= $xml_rpc."\r\n";
     
    	echo '<p>Requête XML-RPC :</p><pre>'.htmlentities($http_request).'</pre>';
     
    	$theSock = fsockopen($rpc_host, $rcp_port, $errno, $errstr,$timeout);
     
    	if($theSock)
    	{	
    		fwrite($theSock,$http_request);
     
    		stream_set_blocking($theSock,1);
    		stream_set_timeout($theSock,10);
    		$info = stream_get_meta_data($theSock); 
     
     
     
    		if ($info['timed_out']) 
    		{
            	echo "Connection Timed Out!";
            } 
    		else 
    		{
                while(!feof($theSock)&&!$info['timed_out'])
    			{
    			$buf .= fgets($theSock,128);
    			}
    			fclose($theSock); 
     
    			echo '<p>Réponse XML-RPC :</p>'."\r\n\r\n".'<pre>'.htmlentities($buf).'</pre>';
            } 
     
    	}
    	else
    	{
    	echo "l ouverture a échoué";
    	}
    malgré la présence du timeout la page se charge indéfiniemùent au lieu de me retourner un message d'erreur

    et par malchance http://www.w3schools.com/webservices/ws_example.asp n'est pas dispo ce matin

  4. #4
    Membre chevronné Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut
    Bonjour,

    Pour gérer les webservices en PHP il y a la librairie SOAP intégré dans PHP5 (ou la librairie NuSOAP pour PHP4, ou pour PHP5 si l'extension SOAP n'est pas activé). Donc il faudrait que tu fasse un phpinfo pour savoir si SOAP est activé dans ton installation de php.

    Et ensuite pour l'extension SOAP tout est bien expliqué ici : http://de3.php.net/manual/fr/ref.soap.php

  5. #5
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut config serveur php
    Merci pour la réponse

    Sur mon serveur php (free donc je n'ai pas la main dessus), cURL est activé mais pas SOAP.

  6. #6
    Membre chevronné Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut
    Dans ce cas tu as deux possibilité :

    Utiliser cURL, mais là je ne sais pas comment ça marche

    Utiliser la librairie nuSOAP telechargable sur le net (ce sont des fichiers PHP en fait) qui marche presque comme la librairie SOAP.

  7. #7
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    je vais donc chercher des tutos sur cURL et nuSAOP

    Juste par curiosité, mon approche via des sockets est complétement fausse?

    En tout cas merci pour tes réponses

  8. #8
    Membre chevronné Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut
    A vrai dire je n'ai que rarement utilisé les sockets...j'imagine que ca peut marcher, ceci dit les webservices avec l'utilisation des méthodes distantes est quand même beaucoup plus puissant.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    Perso j'ai utilisé NuSOAP pour un projet à ma boite, c'est super facile à utiliser et beaucoup moins galère (j'ai trouvé) que SOAP.

  10. #10
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    salut Metfan

    as tu des liens a me conseiller sur nuSOAP?

    merci d avance

  11. #11
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut cURL & nuSOAP
    Bonjour

    J ai énormément de mal à trouver des tuots sur cURL ou nuSOAP afin de comprendre la mise en oeuvre pour pouvoir effectuer mes requêtes XML sur un serveur distant (je cherche toujours a effectuer une requete comme sur la page http://www.w3schools.com/webservices...usToFahrenheit)

    Je débute en web services alors je suis preneur de tout tutos, meme pour grands debutants

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Avec cURL/SimpleXML ça doit donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    function post_c_to_f($temp_c) {
        $ch = curl_init('http://www.w3schools.com/webservices/tempconvert.asmx/CelsiusToFahrenheit');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, 'Celsius=' . $temp_c); // Pas besoin d'(url)encoder
        $data = curl_exec($ch);
        curl_close($ch);
     
        if ($data) {
            $xml = simplexml_load_string($data);
            return (string) $xml;
        }
        return FALSE;
    }
     
    var_dump(post_c_to_f(30));

  13. #13
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    merci pour vos reponses

    ma question suivante sera de savoir si cURL permet d'envoyer des requêtes XML, notamment cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    POST /webservices/tempconvert.asmx HTTP/1.1
    Host: www.w3schools.com
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/CelsiusToFahrenheit"
     
    <?xml version="1.0" encoding="utf-8"?>
    <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/">
      <soap:Body>
        <CelsiusToFahrenheit xmlns="http://tempuri.org/">
          <Celsius>short</Celsius>
        </CelsiusToFahrenheit>
      </soap:Body>
    </soap:Envelope>
    si c'est effectivement le cas , il va donc que je choisisse si je creuse dans la direction de cURL ou de nuSOAP

    gros dilemne

  14. #14
    Membre chevronné Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut
    Avec SOAP ce code suffit a interroger le webservices (avec NuSOAP ca ne doit pas etre trop différent) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $client = new SoapClient("test.wsdl",array('trace'=>1,'exception'=>1));
    $client->CelsiusToFahrenheit(20);

  15. #15
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut j avance
    Salut a tous

    J'ai décidé de m orienter sur nuSOAP pour créer mon client

    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?php
    /*
     *	$Id: wsdlclient3.php,v 1.3 2004/06/25 13:21:22 snichol Exp $
     *
     *	WSDL client sample.
     *
     *	Service: WSDL
     *	Payload: rpc/encoded
     *	Transport: http
     *	Authentication: none
     */
    require_once('./nusoap/lib/nusoap.php');
    $proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
    $proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
    $proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
    $proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
    $client = new soapclient('http://www.w3schools.com/webservices/tempconvert.asmx?wsdl', false,
    											$proxyhost, $proxyport, $proxyusername, $proxypassword);
    $err = $client->getError();
    if ($err) {
    	echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
    }
     
    $call='FahrenheitToCelsius';
    $param=array('Fahrenheit' => (int)80);
    $result = $client->call($call, $param,'','http://tempuri.org/FahrenheitToCelsius');
    // Check for a fault
    if ($client->fault) {
    	echo '<h2>Fault</h2><pre>';
    	print_r($result);
    	echo '</pre>';
    } else {
    	// Check for errors
    	$err = $client->getError();
    	if ($err) {
    		// Display the error
    		echo '<h2>Error</h2><pre>' . $err . '</pre>';
    	} else {
    		// Display the result
    		echo '<h2>Result</h2><pre>';
    		print_r($result);
    		echo '</pre>';
    	}
    }
    echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
    echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
    echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
    ?>
    j arrive maintenant à envoyer une requête et avoir une réponse, seulement la réponse n'est pas bonne ,e je lui envoie Fahrenheit = 80 et il me retourne Celsius=-18 au lieu de Celsius=27.

    je cherche depuis un moment et je ne vois pas où le bas blesse.
    vous pouvez voir le résultat sur http://maquette.requa.fr/essai.php

    merci d avance

  16. #16
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    Pour moi ce n'est pas le webservice qui merde mais plutot le serveur que tu interroge qui te renvoie le mauvais résultat.
    Avec nuSoap les seuls erreurs que tu peux avoir sont au niveau de la connexion et de l'echange de donnée. Mais le webservice ne peut influer sur le resultat que retourne l'autre serveur.

  17. #17
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    ce qui m etonne c est que -18 est le resultat qu on obtient lorsque Fahrenheit=0, du coup je me demande s'il voit bien la valeur de cette variable dans ma requête.

  18. #18
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    essaye juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $param=array('Fahrenheit' => 80);
    c'est peut être du à ton typage.

  19. #19
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    pas mieux
    et meme en passant a un type short avec le code suivant, ca donne rien de mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $temp= new soapval('Fahrenheit','short',80);
    $param=array('Fahrenheit' => $temp);
    sinon est ce que le fait d'envoyer la requête en HTTP1.0 au lieu HTTP1.1 peut avoir un impact?
    si oui je ne vois pas comment changer ce paramètre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] problème php et web service
    Par doudi10 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 29/10/2010, 18h22
  2. [Web Service][SOAP] client php et web service windev
    Par pev15 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 28/05/2010, 13h48
  3. [Web Service] PHP & SOAP - web service
    Par Gregory.M dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 27/12/2008, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo