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

Bibliothèques et frameworks PHP Discussion :

[Web Service] SoapFault exception: [SOAP-ENV:Client] Bad Request


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2018
    Messages : 11
    Points : 7
    Points
    7
    Par défaut [Web Service] SoapFault exception: [SOAP-ENV:Client] Bad Request
    Bonjour, bonjour!

    Actuellement entrain de réaliser un petit webservice que je test en local, lors de l'appel d'une simple méthode je me retrouve avec une jolie erreur me disant :

    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
    Requête : 
     
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:AjouterUnRattachement><$trigramme_service>TST</$trigramme_service><$code_insee>40000</$code_insee></SOAP-ENV:AjouterUnRattachement></SOAP-ENV:Body></SOAP-ENV:Envelope>
     
     
     
    Error :
     
    SOAP-ENV:ClientBad Request 
     
     
     
    Complément :
     
    Fatal error: Uncaught SoapFault exception: [SOAP-ENV:Client] Bad Request in C:\wamp64\www\WebService\service\client.php:15 Stack trace: #0 C:\wamp64\www\WebService\service\client.php(15): SoapClient->__call('AjouterUnRattac...', Array) #1 C:\wamp64\www\WebService\service\client.php(15): SoapClient->AjouterUnRattachement('TST', 40000) #2 {main} thrown in C:\wamp64\www\WebService\service\client.php on line 15

    Voici à quoi ressemble mon fichier client.php :


    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
    require("hydroweb.wsdl");
    require("hydroweb.class.php");
    function gprint($arr)
    {
    	echo '<p><pre>';
    	echo var_dump($arr);
    	echo '</pre></p>';
    }
     
    $res1="";
    $client = new SoapClient('hydroweb.wsdl', ["trace"=>1]);
     
    try
    {
    	$res4 = $client->AjouterUnRattachement("TST", 40000);
    	var_dump($res4);
    }
    catch(SoapFault $fault)
    {
    echo 'Request : <br><xmp>',
    $client->__getLastRequest(),  // Récupérer la dernière requête exécutée
    '</xmp><br><br> Error Message : <br>',
    $client->__getLastResponse().'<br>'; // Récupérer le message d'erreur si présent lors de la requête
    }
    Fonction AjouterUnRattachement dans mon fichier "hydroweb.class.php" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function AjouterUnRattachement($trigramme_service, $code_insee)
    	{
    		$rattach = new tbl_rattachement_sdis_communes($trigramme_service, $code_insee);
    		Gestion::ajouter($rattach);
    	}
    Ma fonction ajouter (PDO) :

    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
     
    public  function setRequeteAjouter($obj)
    	{
    		$classe=get_class($obj);
    		$table = $classe;
    		$proprietes=$obj->getProprietes(); //récupération du tableau associatif clés-valeurs de l'objet
    		// $proprietes=get_object_vars($obj);
    		var_dump($proprietes);
    		$params = array();
    		$sql="INSERT INTO $table "; // sous chaîne correspondant au début de la requête
    		$champs = "("; //sous chaîne pour lister les champs
    		$values ="VALUES("; //sous chaîne pour lister les ? correspondant aux VALUES
    		foreach($proprietes as $key=>$val) 
    		{
    			if(($key != "id_".$classe) && ($key != "id_".get_parent_class($obj))) //on écarte l'identifiant de la table auto incrémenté. Adaptation possible
    			{
    				$champs = $champs .$key .","; //on ajoute le champ
    				$values=$values. "?,";//on ajoute les ? //requête préparée avec marqueurs interrogatifs
    				$params[]=$val;//on ajoute la valeur dans le tableau des paramètres
    			}
    		}
    		// enlever la derniere virgule après le dernier ?
    		$values = rtrim($values, ",");
    		// enlever la derniere virgule après le dernier champ
    		$champs = rtrim($champs, ",");
    		$values = $values . ")"; //on ferme la parenthèse de VALUES
    		$champs = $champs . ")"; //on ferme la parenthèse de la liste des champs
    		$sql = $sql .$champs .$values; //on reconstitue la totalité du texte de la requête
    		$this->requete = $sql; //on stocke le texte de la requête dans $this->requete
    		$this->parametres = $params;//on stocke les valeurs des paramètres dans $this->parametres
    La PS liée :

    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
    	public function setPSAjouter($obj)
    	{
    		//exemple ps = ajouterClient -> ajouter + nom de la classe
    		$classe=get_class($obj);
    		$nomps=self::$_appel." ajouter". get_class($obj). " " .substr(self::$_syntaxe,0,1);//Appel et nom de la procedure stockée
    		$proprietes=$obj->getProprietes();
    		//try
    		{
    			$i=0;
    			$params = array();
     
    			foreach($proprietes as $key=>$val)
    			{	
    				if(($key != "id_".$classe) && ($key != "id_".get_parent_class($obj)) ) //on écarte l'identifiant auto incrémenté de la table . Adaptation possible
    				{
    					$nomps = $nomps. " ?,";
    					$params[] = $val;
    				}
    			}
    			$nomps = rtrim($nomps, ",");// enlever la derniere virgule
    			$nomps = $nomps . substr(self::$_syntaxe,1,1);
    			$this->requete = $nomps;
    			$this->parametres = $params;
    		}
    		/*catch (PDOException $e)
    		{
    			throw new PDO3Exception( $e->code);
    		}*/
    	}// fin de la méthode setPSAjouter()

    Et pour finir la partie du WSDL correspondant :

    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
    <message name="AjouterUnRattachementRequest">
    	<part name="$trigramme_service" type="xsd:string"/>
    	<part name="$code_insee" type="xsd:int"/>
    </message>
    <message name="AjouterUnRattachementResponse">
    </message>
     
    <operation name="AjouterUnRattachement">
    	Ajouter une Rattachement de SDIS / Commune : <input message="typens:AjouterUnRattachementRequest"/><br/>
    	<output message="typens:AjouterUnRattachementResponse"/><br/>
    </operation>
     
    <operation name="AjouterUnRattachement">
    	<soap:operation soapAction="urn:RattachementAction"/>
    	<!-- <input> -->
    	<!-- <soap:body namespace="urn:RATTACHEMENT" use="encoded"  -->
    				<!-- encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> -->
    	<!-- </input> -->
    	<output>
    	<soap:body namespace="urn:RATTACHEMENT" use="encoded" 
    				encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    	</output>
    </operation>

    Aidez-moi je ne comprends plus là, car l'utilisation de la même méthode se fait sans aucun problème sur une autre table, alors si quelque chose vous tape dans l'oeil, dites le, je suis débutant dans tout ça !
    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
    Voici une explication technique: le schéma de wsdl dit que
    Citation Envoyé par wsdl_doc
    <xs:attribute name="name" type="xs:NCName" use="required"/>
    qui fait partie du type de l'élément part de l'enfant de l'élément message.

    Or, que veut dire tout ça? Il veut dire que l'attribut name doit être du type NCName, nom (terme technique, pratiquement signifie la construction d'un nom d'un élément xml) sans colon. Sans colon, parce que le nom fait partie d'une manière forcée du namespace spécifié par l'attribut targetNamespace. Et puis le nom (local) d'un élément ne devrait jamais commencer par le signe $. Il peut être commencer par _ ou quelque alphabets au sens international et en tout non numérique non plus...

    Dans une explication pas autant technique, il ne faut pas autoriser les noms (l'attribut apparus dans les partie part) comme $trigramme_service et $code_insee. Ces noms vont être servis précisément dans la requête comme vous pouvez vous-même témoigner.

    La déduction simple est de remplacer ces noms en enlevant le signe $.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <message name="AjouterUnRattachementRequest">
            <!--
    	<part name="$trigramme_service" type="xsd:string"/>
    	<part name="$code_insee" type="xsd:int"/>
            -->
    	<part name="trigramme_service" type="xsd:string"/>
    	<part name="code_insee" type="xsd:int"/>
    </message>
    et faites attention en plus au code php qui les dépend.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2018
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Tout d'abord, merci de votre aide.

    J'ai effectué les modifications directement après avoir lu votre message, grosse erreur d'étourderie de ma part . Merci de me l'avoir fait remarquer!
    Problème étant, l'erreur n'est point solvée, même après correction du XML.
    Si vous voyez autre chose dites moi car je dois avouer que je ne sais plus quoi faire, je ne comprends pas pourquoi cela ne daigne fonctionner alors que maintenant tout me semble bon (mais apparemment je me trompe...).

  4. #4
    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
    Et puis, on doit scrutiniser un peu plus la requête, nouvelle version et d'ailleurs comme l'originale. L'élément apparu, SOAP-ENV:AjouterUnRattachement, devrait être faux, à mon sens certainement faux. AjouterUnRattachement doit être préfixé soit le targetNamespace du wsdl et comme les éléments enfants soulignés déjà, trigramme_service et code_insee, soit ils sont tous les trois sans préfixe de namespace. Comment arrivé AjouterUnRattachement est préfixé par SOAP-ENV est ce qu'il faut regarder de plus près.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2018
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Un grand merci !!!

    En effet, en modifiant le namespace de mon binding de :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	<operation name="AjouterUnRattachement">
    		<soap:operation soapAction="urn:RattachementAction"/>
    		 <!-- <input>  -->
    		 <!-- <soap:body namespace="urn:RATTACHEMENT" use="encoded"   -->
    					 <!-- encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>  -->
    		 <!-- </input>  -->
    		<output>
    		<soap:body namespace="urn:RATTACHEMENT" use="encoded" 
    					encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    		</output>
    	</operation>
    A ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	<operation name="AjouterUnRattachement">
    		<soap:operation soapAction="urn:RattachementAction"/>
    		 <!-- <input>  -->
    		 <!-- <soap:body namespace="urn:hydroweb" use="encoded"   -->
    					 <!-- encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>  -->
    		 <!-- </input>  -->
    		<output>
    		<soap:body namespace="urn:hydroweb" use="encoded" 
    					encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    		</output>
    	</operation>
    Le problème fut résolu! J'avais en effet utilisé un différent namespace dans mon binding que celui définit dans mes définitions, il devait donc y avoir un conflit?

    Merci beaucoup de votre aide!
    Problème résolu!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/05/2011, 21h22
  2. [Web Service] Fatal error sur un client SOAP
    Par jerome600 dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 15/03/2011, 11h01
  3. [Web Service] SoapFault exception: [HTTP] Unknown protocol.
    Par babou54 dans le forum Bibliothèques et frameworks
    Réponses: 77
    Dernier message: 07/01/2010, 11h27
  4. Web Services - Problème de communication serveur/client
    Par vern's dans le forum Web & réseau
    Réponses: 9
    Dernier message: 27/08/2007, 10h06
  5. Web services asynchrone - push server vers client
    Par boulb dans le forum Services Web
    Réponses: 3
    Dernier message: 28/11/2006, 18h51

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