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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    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 Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    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 Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 114
    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>

+ 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