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 :

utiliser un web service en POST


Sujet :

Langage PHP

  1. #1
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut utiliser un web service en POST
    Bonjour,

    Je dois utiliser un web service pour la première fois, et même si j'ai des indications assez précises je rame pour les traduire en PHP...

    Voici mes consignes :
    1. appeler l'URL http://toto
    2. utiliser un header avec des attributs Accept et Content-Type
    3. envoyer un body formaté en XML
    4. envoyer le tout en POST


    Voici mon dernier test :

    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
    $url = 'http://toto';
     
    $data ='<attrs>
    <attr name="userName" type="string"/>Ali Baba</attr>
    <attr name="password" type="string"/>Sésame, ouvre-toi</attr>
    <attr name="auth" type="string" possibilities="secEnterprise,secLDAP,secWinAD,secSAPR3">secEnterprise</attr>
    </attrs>
    ';
     
    $options = array(
        'http' => array(
            'header'  => "Content-type: application/xml\r\nAccept: application/xml",
            'method'  => 'POST',
    	'content' => urlencode($data) 
        )
    );
    $context  = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    if ($result === FALSE) { echo "raté" ; }
     
    var_dump($result);
    Comme résultat, j'obtiens bien sûr raté.

    L'un des trucs que je ne comprends pas : en POST, je suis censé envoyer des paires clef/valeur et pas un code XML... Est-ce que je dois l'associer à une clef ?

    Je fais sans doute un paquet d'erreurs de débutant...

  2. #2
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    file_get_contents utilise le protocole openssl est-ce que celui-ci est bien activé ? On sait jamais ...

    Sinon j'ai toujours utilisé les webservices avec des variables en GET et non en POST, je suis curieux de connaitre la réponse aussi

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Merci de ta réponse, je faisais du SSO sans le savoir, et ça doit être au moins une partie du problème !

    Quelle fonction PHP tu utiliserais pour envoyer un POST ? fopen ?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    A première vue ton code est correct.

    file_get_contents utilise le protocole openssl est-ce que celui-ci est bien activé ? On sait jamais ...
    Son url semble être du http, donc openssl n'intervient pas là dedans.

    Est ce qu'un get tout simple marche ?
    Si non , c'est sans doute la directive allow_url_fopen qu'il faut passer à 1 : http://php.net/manual/en/filesystem.configuration.php

    Tu peux essayer dans ton tableau d'option du stream d'ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'ignore_errors' => TRUE
    Et pour finir essayer d'afficher le code de retour HTTP peut également aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($http_response_header);
    http://php.net/manual/en/reserved.va...onseheader.php

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Citation Envoyé par grunk Voir le message
    Est ce qu'un get tout simple marche ?
    Si j'appelle l'URL directement dans un navigateur, le serveur me répond et me donne un exemple du XML à renseigner. C'est ça que tu voulais dire par "Est ce qu'un get tout simple marche ?
    Citation Envoyé par grunk Voir le message
    Si non , c'est sans doute la directive allow_url_fopen qu'il faut passer à 1 : http://php.net/manual/en/filesystem.configuration.php
    OK, mais après j'utilise quoi ? file_get_contents ? fopen ? curl ???

    Désolé si je pose des questions idiotes, c'est ma toute toute première fois

  6. #6
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    Son url semble être du http, donc openssl n'intervient pas là dedans.
    Rien à voir.

    Il peut utiliser curl ou openssl

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Je viens d'essayer avec fopen, et j'obtiens quelque chose

    array (size=6)
    0 => string 'HTTP/1.1 401 Non-Autoris�' (length=25)
    1 => string 'Server: Apache-Coyote/1.1' (length=25)
    2 => string 'Date: Fri, 20 May 2016 12:50:49 GMT' (length=35)
    3 => string 'Content-Type: application/xml' (length=29)
    4 => string 'Content-Length: 129' (length=19)
    5 => string 'Connection: close' (length=17)

    C:\wamp64\www\test2.php:32:resource(3, stream)
    Il faut juste que je récupère mon stream...

    C'est bon avec stream_get_contents.

    Merci beaucoup !

    J'ai crié victoire un peu vite... La réponse que j'obtiens m'indique que mon appel est mal formaté...

    Vous voyez un truc que j'aurais dû faire ou que je devrais tester ? encoder en JSON ? Utiliser SoapClient ?

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Si j'appelle l'URL directement dans un navigateur, le serveur me répond et me donne un exemple du XML à renseigner. C'est ça que tu voulais dire par "Est ce qu'un get tout simple marche ?

    OK, mais après j'utilise quoi ? file_get_contents ? fopen ? curl ???
    Quand je dis un get tout simple c'est faire file_get_contents("http://google.fr"); par exemple, histoire de valider le fait que tu puisse interroger une url distante.

    Citation Envoyé par -Rpass- Voir le message
    Rien à voir.

    Il peut utiliser curl ou openssl
    Si tu interroges une url https , évidemment que openssl entre en jeu. Pour du http simple (donc sans ssl ou tls) openssl n'intervient pas.

    J'ai hâte que tu me montre comment on fait une requête http avec openssl ... Curl est une alternative aux stream en effet.

    Citation Envoyé par Antoun Voir le message
    Vous voyez un truc que j'aurais dû faire ou que je devrais tester ? encoder en JSON ? Utiliser SoapClient ?
    Tu mélanges tous.
    Si ton webservice est en SOAP oui il faut un soapclient. Si c'est du REST les stream suffisent (ou curl selon ta préférence).
    Envoyer du JSON non , sauf si le webservice attends du json.

    L'erreur 401 que tu reçois signifie que tu dois très probablement t'authentifier sur le webservice.

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Citation Envoyé par grunk Voir le message
    Quand je dis un get tout simple c'est faire file_get_contents("http://google.fr"); par exemple, histoire de valider le fait que tu puisse interroger une url distante.
    OK... si le serveur m'a répondu que ma requête était mal foutue, ça suffit pour démontrer que j'ai le droit de l'interroger ?
    Citation Envoyé par grunk Voir le message
    Si tu interroges une url https , évidemment que openssl entre en jeu. Pour du http simple (donc sans ssl ou tls) openssl n'intervient pas.
    J'ai hâte que tu me montres comment on fait une requête http avec openssl ... Curl est une alternative aux stream en effet.
    c'est du simple http.
    Citation Envoyé par grunk Voir le message
    Tu mélanges tout.
    bah oui, je n'y connais rien
    Citation Envoyé par grunk Voir le message
    Si ton webservice est en SOAP oui il faut un soapclient. Si c'est du REST les stream suffisent (ou curl selon ta préférence).
    Envoyer du JSON non , sauf si le webservice attends du json.
    A priori, c'est décrit comme du REST, donc j'oublie SOAP.
    A relire la doc, j'ai le choix entre communiquer en XML ou en JSON. J'ai choisi XML dans mon content-type, donc ce n'est pas JSON la solution...
    Citation Envoyé par grunk Voir le message
    L'erreur 401 que tu reçois signifie que tu dois très probablement t'authentifier sur le webservice.
    En fait c'est exactement ce que j'essaie de faire . C'est un web service qui reçoit un login et un mot de passe et doit répondre par un jeton de session.

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    J'ai trouvé !
    Il y avait deux erreurs : d'abord une bête coquille XML, puisque j'utilisais des balises <attr/></attr>, il fallait enlever le / en trop. Ensuite, il fallait virer le urlencode, qui ne doit pas être nécessaire en POST.

    ça fonctionne bien avec un compte dont le mot de passe ne contient pas de caractère spécial. Par contre, si le mot de passe contient un arobase, le mot de passe est mal interprété et la connexion rejetée... j'ai essayé de le remplacer par %40 et par &commat;, sans succès. Quelqu'un a une idée ?

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Utilise urlencode sur les string de data, mais pas sur les balises xml

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    J'ai essayé de remplacer le @ du mot de passe par %40, ça ne fonctionne pas...

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Citation Envoyé par Antoun Voir le message
    J'ai essayé de remplacer le @ du mot de passe par %40, ça ne fonctionne pas...
    Ne le fais pas manuellement, fais urlencode() pour voir?

  14. #14
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Désolé, en fait tout marche bien pour les caractères spéciaux, c'était un autre paramètre qui était mauvais.

    Merci à tous pour les questions et les conseils !


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

Discussions similaires

  1. Utiliser un web service php depuis dotnet
    Par mnemonic78 dans le forum C#
    Réponses: 1
    Dernier message: 04/11/2008, 15h00
  2. utilisation de web Service
    Par asmoune dans le forum Services Web
    Réponses: 6
    Dernier message: 20/09/2008, 22h13
  3. [Web Service][SOAP] Utiliser un web service .NET
    Par Madinico dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 18/03/2008, 08h28
  4. utiliser un web service php avec Visual Studio
    Par <% Bastien %> dans le forum Services Web
    Réponses: 6
    Dernier message: 15/03/2008, 16h26
  5. Réponses: 0
    Dernier message: 11/12/2007, 11h42

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