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 :

XML : <erreur> Le Content type doit etre : text/xml </erreur> avec CURL et PHP


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut XML : <erreur> Le Content type doit etre : text/xml </erreur> avec CURL et PHP
    Bonjour a tous, je suis en train de créer un fichier PHP qui va générer un fichier xml qui sera enfin envoyé sur un serveur distant.

    Le pb que je rencontre c'est que je reçois la réponse suivante :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>
    <head>
    </head>
    <body>
    <a href="http://www.xxxxx.fr/export_DUPONT_Olivier_1.xml" target="_blank"> Voir fichier</a>
    <validation_serveur>
    <erreur>
    Le Content type doit etre : text/xml
    </erreur>
    </validation_serveur>
    </body></html>




    j'ai beau chercher sur gg il semblerait qu'il faille rajouter le header content, mais quelque soit l'endroit ou je le mets ça ne marche pas , si vous pouviez s'il vous plait m'aider, voici mon 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
    49
    50
    51
    52
    53
    54
    55
      <?php
    session_start();
    include ('config.php');
    $id=@$_GET['id'];
    header("Content-Type: text/xml");
    header("Cache-Control: no-cache, must-revalidate");
     
        $result_table= mysql_query("SELECT * FROM tablewhere id='$id'");
        $num_table = mysql_num_rows($result_table);
    	if ($num_table != 0) {
     
    	   while ($row = mysql_fetch_array($result_table)) {
           $file= fopen("export_$row[nom_e]_$row[prenom_e]_$row[id].xml", "w");
    	   $_xml ="<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    	   $_xml .="";
     
    $_xml .="<DOSSIER>
    	..... toutes les balises ....
    </DOSSIER>";
     echo '<html>
    <head>
    </head>
    <body>
    <a href="http://'. $url_index.'/export_'.$row["nom_e"].'_'.$row["prenom_e"].'_'.$row["id"].'.xml" target="_blank"> Voir fichier xml </a>
    ';
     
    $nom_xml=$row["nom_e"].'_'.$row["prenom_e"].'_'.$row["id"];
    //	   $_xml .="header('Content-Type: text/xml')"; 
          }
      	  	// echo $_xml;
    		fwrite($file, $_xml);
            fclose($file);
      /*
       * XML Sender/Client.
       */
      $file = 'http://'. $url_index.'/export_'.$nom_xml.'.xml';
      if(!$xml_builder = simplexml_load_file($file))
      exit('Failed to open '.$file);
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, "https://urlduserveur");
      curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_builder);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
      curl_setopt($ch, CURLOPT_REFERER, 'https://urlduserveur');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      $ch_result = curl_exec($ch);
      curl_close($ch);
      // Print CURL result.
      echo $ch_result;
     
        }
    echo '</body></html>';
    ?>
    Merci milles fois de votre aide
    olivier

  2. #2
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut
    Bonjour,

    En activant l'option cURL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    Tu récupères dans $ch_result la réponse de ton serveur à ton appel cURL.

    Lorsque tu fais ton echo $ch_result tu imprimes dans ton code html la réponse du serveur qui est :

    <validation_serveur>
    <erreur>
    Le Content type doit etre : text/xml
    </erreur>
    </validation_serveur>
    tu peux donc enlever

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Type: text/xml");
    Tout en haut de ton code et va voir du côté de ton script côté serveur (celui que tu appelle avec cURL, c'est lui qui te renvoie cette erreur à mon avis.

    Pour en être sûr fait lui renvoyer un coucou tout simple et tu verras que ça devrait marcher.

    Si tu ne t'en sors toujours pas essaye de poster ici le script que tu appelles avec ta requête cURL.

    Bonne journée

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Merci Alejandro pour cette première réponse,

    J'ai supprimé le header,

    je n'ai plus l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <validation_serveur>
    <erreur>
    Le Content type doit etre : text/xml
    </erreur>
    </validation_serveur>
    mais j'ai ça qui apparait :
    Voir fichier xml

    Le Content type doit etre : text/xml

  4. #4
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut
    Rebonjour,

    Au début du script que tu appelles avec cURL pour pousser ton fichier xml sur le serveur, essaye de mettre qq chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'hello world'; exit;
    Normalement ton message d'erreur risque de devenir : hello world

    Tiens moi au courant

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Exact dorénavant j'ai :

    Voir fichier xml

    hello world

    Que dois je comprendre ?

  6. #6
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut


    Que c'est ton script côté autre serveur qui marche pas, tu devrais essayer de dumper tes entêtes de requête pour voir si ton champ content-type text/xml y apparait bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    header('content-type: text/plain');
    var_dump(getallheaders());
    exit;
    Tu met ça à la place de ton hello world.

    Tu envoie cette en-tête dans ta requête cURL quand tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Coté serveur, c'est a dire.. le serveur qui reçoit mon fichier ?

    Si c'est ça je n'ai pas accès a ce serveur la, je n'ai uniquement acces qu'a mon serveur envoi via curl...pas celui qui le reçoit !

    voila ce que j'ai comme resultat :

    <html>
    <head>
    </head>
    <body>
    <a href="http://www.urldemonfichier/export_DUPONT_Olivier_1.xml" target="_blank"> Voir fichier xml</a><br><br />
    <b>Fatal error</b>: Call to undefined function getallheaders() in <b>/home/xxx/www/export.php</b> on line <b>298</b><br />

    Apparemment cette fonction n'est pas supportée :https://bugs.php.net/bug.php?id=65917

  8. #8
    Membre habitué Avatar de alejandro
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2004
    Messages : 167
    Points : 188
    Points
    188
    Par défaut
    ok, dans ce cas peut-être que leur programme attends un entête tout en minuscule ou va savoir, essaye de mettre "content-type" plutot que "Content-Type" ou alors "Content-type".

    Ensuite tu peux essayer d'envoyer l'autre type mime pour xml :

    content-type: application/xml
    Sinon vérifie également la requête que tu envoie au serveur distant :
    http://php.net/manual/fr/function.curl-getinfo.php

    ps: c'est normal que tu aie une erreur si tu fais un getallheaders() à partir d'une ligne de commande par exemple, c'est censé te retourner les entêtes de ta requête mais c'est sur l'autre serveur qu'il aurait fallu l'utiliser

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Le problème vient peut-être de là En effet, il y a deux espaces avant le delimiteur php, or quand tu envoies un header, il faut qu'il arrive en premier, mais là ce sont deux espaces qui arrivent en premier. Un header doit arriver avant le moindre caractère.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  10. #10
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Bonsoir

    As-tu essayé avec ce code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml; charset=utf8'));
    Car visiblement ton XML est encodé en UTF-8.

    Il faut distinguer 3 parties dans ton code :
    la génération du XML à envoyer
    l'envoi du XML et réception de la réponse du serveur
    l'affichage du résultat de ton script

    1- le XML à envoyer : tu peux l'écrire dans un fichier sur ton disque local (appel à file_put_contents()) en plus de l'envoyer au serveur distant (appels à cURL), cela permettra de valider que le fichier transmis est correct ;
    2- l'envoi du XML : à ta place je n'utiliserais pas cURL mais l'un des frameworks existants, par exemple Zend_Http ou Guzzle, ce sera bien plus simple à coder et à déboguer ;
    3- c'est là qu'interviennent la fonction header() ainsi que les espaces avant et après les balises PHP.

Discussions similaires

  1. [POI] Erreur "Package should contain a content type part [M1.13]"
    Par mouss4rs dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 16/07/2014, 19h45
  2. [SimpleXML] Erreur LibXml "Extra content at the end of the document" malgré XML valide
    Par saintbios dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 26/07/2012, 14h57
  3. Réponses: 6
    Dernier message: 24/11/2010, 22h56
  4. parser une reponse xml avec content-type="text/html"
    Par roro06 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 15/10/2010, 11h30
  5. Réponses: 6
    Dernier message: 13/01/2010, 17h29

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