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

XML/XSL et SOAP Discussion :

Problème soap - Bad request - Php


Sujet :

XML/XSL et SOAP

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut Problème soap - Bad request - Php
    Bonjour à tous,

    J'ai un problème à consommer un webservice. J'ai une erreur:
    Message: Bad Request - Line Number: 287
    Code php : 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
    $client = new SoapClient($wsdl,[
                'exceptions' => 1,
                'cache_wsdl' => WSDL_CACHE_NONE,
                'trace' => 1
            ]);
            $header = '<s:Header>
                            <h:LoginHeader xmlns:h="Enovation/Webservice" xmlns="Enovation/Webservice"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                                <Password>'.$password.'</Password>
                                <Username>'.$user.'</Username>
                            </h:LoginHeader>
                        </s:Header>';
            $headerVar = new SoapVar($header, XSD_ANYXML);
            $header = new SoapHeader('Enovation/Webservice', 'LoginHeader', $headerVar);
            $client->__setSoapHeaders(array($header));
     
     
            $params = array($method => array(
                'Residence' => array (
                    'Address' => 'XXXXX',
                    'HomeNumber' => '27',
                    'ZipCode' => 'XXXXX',
                    'Place' => 'Sint-Eloois-Vijve',
                    'HomeTelephone' => '056XXXXX',
                    'Client' => array (
                    'Name' => 'XXXXXX',
                    'FirstName' => 'XXXXX',
                    'ClientTelephones' => array (
                        'ClientTelephone' => array (
                        'Number' => '0496XXXXX',
                        'Description' => 'Algemeen',
                        ),
                    ),
                    'BirthDate' => 'XXXX-11-20T00:00:00.000Z',
                    'Group' => '17 CM West-XXXXX',
                    'Gender' => 'M',
                    'Cohabitation' => 'Alleenwonend',
                    'MemoClient' => 'Persoonlijk Alarm Systeem',
                    'Language' => 'NL',
                    'CitizenServiceNr' => 'XXXXX2034760',
                    'RecordingAlarmCalls' => 'true',
                    'EmailAddress' => '',
                    )
                )
            ));
            $return = $client->__soapCall($method, $params); //Line Number: 285
     
            print_r($client);

    Quelqu'un as une idée ?


    Merci d'avance

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Ce que vous pouvez faire ou devrez faire, c'est d'ajouter une ligne pour récoupérer la requiert pour déboguer ou autre. Il dépend que 'trace'=>1 (ou true) - ce qui est en place déjà.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $client->__getLastRequest();
    Est-ce que le résultat coincide à ce que vous désirez d'avoir ? C'est le point de départ de débogage.

    Si on n'a pas d'idée ce qu'elle doit être, il faut étudier ensuite le document wsdl. PHP là veut cacher le détail pour porter service et valeur aux clients, mais quand quelque chose ne marche, il faut connâitre le contrat wsdl pour faire une idée en profondeur. Voilà pour le moment !

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut
    Bonjour,

    Voici ce que retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $client->__getLastRequest();
    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
    SoapClient Object
    (
        [trace] => 1
        [_stream_context] => Resource id #6
        [_soap_version] => 1
        [sdl] => Resource id #9
        [__default_headers] => Array
            (
                [0] => SoapHeader Object
                    (
                        [namespace] => Enovation/Webservice
                        [name] => LoginHeader
                        [data] => SoapVar Object
                            (
                                [enc_type] => 147
                                [enc_value] => 
                          <s:header>
                            <h:loginheader xmlns:h="Enovation/Webservice" xmlns="Enovation/Webservice" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                                <password>7e4cfc94e31ba7c1a31c657b653b1c0eXXXXXXXX</password>
                                <username>userXXXXXXXX</username>
                            </h:loginheader>
                        </s:header>
     
                            )
     
                        [mustUnderstand] => 
                    )
     
            )
     
    )
    Le header correspond bien a ce que je dois envoyer sauf que les élements du xml devraient être en majuscule (<s:header> => <s:Header>, <h:loginheader => <h:LoginHeader)
    Avez vous besoin d'autre chose ?

    Merci

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut
    Je viens de voir que dans le body, il y a <ns1:importclient></ns1:importclient>, ce qui ne devrait pas
    Dans codeigniter, j'ai fait un extend de SoapClient
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MySoapClient extends SoapClient
    {
            public function __doRequest($request, $location, $action, $version, $one_way=0)
            {
                 $xml = str_replace('ns1:', '', $request);
                 parent::__doRequest($xml, $location, $action, $version, $one_way);
            }
    }
    Mais j'ai toujours le namespace dans le body.

  5. #5
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Faites voir une par une. Commençons le début pour l'instant.
    Le header correspond bien a ce que je dois envoyer sauf que les élements du xml devraient être en majuscule (<s:header> => <s:Header>, <h:loginheader => <h:LoginHeader)
    Non, ce ne devrait pas être. Ceci signifie que le header est faux déjà - on n'écrit pas s:Header là dans $header, mais ce n'est la seule chose à faire attention... Aussi, l'attribut mustUnderstand maintenant est indéfini. Est-ce que le wsdl ne dit rien desus ? Pour transmettre les crédentiels via le header, ça semble plutôt qu'il doive exiger mustUnderstand étant 1 ou true - mais le wsdl a le dernier mot. Ce dernier peut être précisé quand on appèle au constructeur SoapHeader(), plus précisément le quartrième argument. Regardez de plus près le wsdl, c'est là qu'il faut toujours retomber ...
    Le header correspond bien a ce que je dois envoyer sauf ...
    et ça ne se spécule pas.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut
    Mon header est correct maintenant, merci!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                        <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="www.verklizan.com" xmlns:ns2="Enovation/Webservice">
                          <SOAP-ENV:Header>
                            <s:LoginHeader xmlns:h="Enovation/Webservice" xmlns="Enovation/Webservice"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                                <Password>7e4cfc94e31ba7c1a31c657XXXXXXXX</Password>
                                <Username>userXXXXX</Username>
                            </s:LoginHeader>
                           </SOAP-ENV:Header>
    J'ai modifié la fonction __doRequest
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                $request = preg_replace('/<ns1:(\w+)/', '', $request, 1);
                $request = preg_replace('/<\/ns1:(\w+)/', '', $request);
                $request = str_replace(array('/ns1:', ''), array('/', ''), $request);
                parent::__doRequest($request, $location, $action, $version, $one_way);

    J'ai maintenant /> dans le body, je pense que ça vient de la fonction __doRequest ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                           <SOAP-ENV:Body> /> </SOAP-ENV:Body>
                        </SOAP-ENV:Envelope>

  7. #7
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                            <s:LoginHeader xmlns:h="Enovation/Webservice" xmlns="Enovation/Webservice"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                                <Password>7e4cfc94e31ba7c1a31c657XXXXXXXX</Password>
                                <Username>userXXXXX</Username>
                            </s:LoginHeader>
    Ce semble beaucoup mieux, mais pas tout-à-fait ! Le préfix s n'est déclaré null part. Si le header est établi de la façon esquissée dans le premier poste, je dirais laisser le préfix s (ou h ?, sais pas) et le namespace par défaut ferait son travail.

    Et puis, je ne vois pas clair pour quelle raison on doit travailler au dernier moment encore sur $request par regex. Si quelque élément du genre ns1:abc est là ou il ne devrait y être, il vaut mieux se demander pourquoi qu'il soit là et éliminer au souce - pas après coup au résultat $request. Voilà pour le moment !

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut
    Ce semble beaucoup mieux, mais pas tout-à-fait ! Le préfix s n'est déclaré null part. Si le header est établi de la façon esquissée dans le premier poste, je dirais laisser le préfix s (ou h ?, sais pas) et le namespace par défaut ferait son travail.
    Dans la documentation que j'ai reçu, le header est défini comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <s:Header>
     <h:LoginHeader xmlns:h="Enovation/Webservice" xmlns="Enovation/Webservice"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Password>XXXXXXXXXXXXXXXXX</Password>
      <Username>XXXXXXX</Username>
     </h:LoginHeader>
    </s:Header>
    Et puis, je ne vois pas clair pour quelle raison on doit travailler au dernier moment encore sur $request par regex. Si quelque élément du genre ns1:abc est là ou il ne devrait y être, il vaut mieux se demander pourquoi qu'il soit là et éliminer au souce - pas après coup au résultat $request. Voilà pour le moment !
    Dans soapUI:
    si je laisse le ns1: avec mes données, je reçois une erreur -> 400 Bad Request
    si je laisse le ns1: sans mes données, je reçois une erreur ->274 Incorrect XML definition du server
    si je supprime le ns1: avec mes données, je reçois l'erreur -> This Transaction has completed; it is no longer usable.

    Est-ce que je peux poster l'url de la WSDL sans avoir un problème de sécurité ? ou en MP ?

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut
    J'ai enfin reçu un exemple
    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
     
    <?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:Header>
        <LoginHeader xmlns="www.verklizan.com">
          <Password>string</Password>
          <Username>string</Username>
        </LoginHeader>
      </soap:Header>
      <soap:Body>
        <ImportClient xmlns="www.verklizan.com">
          <xmlMessageString>string</xmlMessageString>
        </ImportClient>
      </soap:Body>
    </soap:Envelope>

  10. #10
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Dans la documentation que j'ai reçu, le header est défini comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <s:Header>
     <h:LoginHeader xmlns:h="Enovation/Webservice" xmlns="Enovation/Webservice"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Password>XXXXXXXXXXXXXXXXX</Password>
      <Username>XXXXXXX</Username>
     </h:LoginHeader>
    </s:Header>
    N'avez-vous pas remarqué la différence de ceci avec ce que vous avez posté jusqu'avant ? Ici, le préfix s correspond bien à SOAP-ENV de celui-là et LoginHead vit bien dans le namespace "Enovation/Webservice' de préfix h ici. Or là, le namespace représenté par le préfix s dans le poste aupravant n'est pas déclaré null part et c'est fatal pour une requiert passée au serveur. Le dernier fragment-ci est bien correct, il me semble, bien entendu. Peut-être c'était un typo ? sais pas.

    Comme il me semble le problème est résolu, je peux vous laisser tranquille.

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    Points : 88
    Points
    88
    Par défaut
    Comme il me semble le problème est résolu, je peux vous laisser tranquille.
    J'ai toujours une erreur Bad Request mais je pense que cela vient du fournisseur du webservice. J'attends de leur nouvelle

    Je te remercie pour ton aide tsuji

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

Discussions similaires

  1. [Web Service] SoapFault exception: [SOAP-ENV:Client] Bad Request
    Par Aurel122 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 01/02/2018, 11h25
  2. message soap en langage C [bad request]
    Par yamnetouaga dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/04/2012, 14h57
  3. Client SOAP Delphi, serveur PHP, problème de types
    Par le_viking dans le forum Web & réseau
    Réponses: 3
    Dernier message: 06/01/2012, 10h36
  4. [Web Service] Problème avec service web PHP (SOAP)
    Par daemyn dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 18/05/2010, 20h49
  5. problème upload d'images + bad request
    Par s.n.a.f.u dans le forum Développement
    Réponses: 1
    Dernier message: 12/06/2008, 22h21

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