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 :

[JSON] Impossible de mettre le content-type à application/json via PHP


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 32
    Par défaut [JSON] Impossible de mettre le content-type à application/json via PHP
    Bonjour,

    J'ai une page php sur mon serveur qui fait appel à une url distante pour récupérer le résultat JSON.
    L'url distante renvoie bien les données avec l'entête application/json (déboggueur chrome)
    J'essaye de mettre ce résultat sur ma page locale en utilisant file_get_contents pour servir une autre page locale.

    La page que je génère contient dans son code source un retour chariot au début en plus du résultat distant et surtout est de content-type text/html au lieu de application/json
    J'ai du en plus faire un stripslashes pour que ça soit un JSON valide.

    Je ne comprends pas en ajoutant header('Content-type: application/json') que je reste toujours en text/html.
    J'ai essayé plusieurs choses en vain et rien trouvé sur google.
    J'ai bien évidemment testé une page simple qui renvoie bien sur mon serveur un content-type application/json pour écarter la piste du serveur.

    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
    <?php 
    header('Cache-Control: no-cache, must-revalidate');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    header('Content-type: application/json');
     
    function curPageURL() {
     $pageURL = 'http';
     if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
     $pageURL .= "://";
     if ($_SERVER["SERVER_PORT"] != "80") {
      $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
     } else {
      $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
     }
     return $pageURL;
    }
     
    function smartstripslashes($str) {
      $cd1 = substr_count($str, "\"");
      $cd2 = substr_count($str, "\\\"");
      $cs1 = substr_count($str, "'");
      $cs2 = substr_count($str, "\\'");
      $tmp = strtr($str, array("\\\"" => "", "\\'" => ""));
      $cb1 = substr_count($tmp, "\\");
      $cb2 = substr_count($tmp, "\\\\");
      if ($cd1 == $cd2 && $cs1 == $cs2 && $cb1 == 2 * $cb2) {
        return strtr($str, array("\\\"" => "\"", "\\'" => "'", "\\\\" => "\\"));
      }
      return $str;
    }
     
    $site_link = curPageURL();
    $site_link = str_replace('xxx','yyy',$site_link);
    $homepage = file_get_contents($site_link);
    $decoded = smartstripslashes($homepage);
    $data = json_decode($decoded, true);
    exit( json_encode($data));
    ?>
    J'ai essayé de rajouter un \r\n à la fin, essayé de lire avec un $context application/json pour file_get_contents sans succès.
    J'ai fini par récupéré le JS ajax de google prototype.js en local et ôter la sécurité sur application/json pour que ça fonctionne. Mais je trouve cette solution non propre.

    Avez-vous une idée sur comment résoudre ce content-type.

    Merci de votre aide.

    PHP/5.4.9

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exit( json_encode($data));
    Pourquoi tu fais un exit() ?
    Surtout avec un paramètre non conforme...
    Un simple echo devrait être plus efficace !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 32
    Par défaut
    J'ai lu sur certains forum qu'il valait mieux mettre exit ou die pour sortir en JSON.

    Pour autant j'ai testé les deux et toujours avec une sortie text/html

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exit( json_encode($data));
    Pourquoi tu fais un exit() ?
    Surtout avec un paramètre non conforme...
    Un simple echo devrait être plus efficace !
    Je pratique également la solution "exit". Cela assure qu'aucun code ne sera exécuté par la suite.

    Citation Envoyé par Bovino Voir le message
    Surtout avec un paramètre non conforme...
    Quel paramètre non conforme ?

    Citation Envoyé par Bovino Voir le message
    Un simple echo devrait être plus efficace !
    Si tu as du code après le echo, il sera exécuté.
    C'est en particulier pour certains frameworks, qui peuvent effectuer du code en fin de traitement sans que l'on ne s'en rende compte.

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut


    Effectivement, je me suis un peu égaré !
    Au temps pour moi...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

Discussions similaires

  1. [Javamail] Lecture pièce jointe, content-type: Application/octet-stream
    Par rtsKyo dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 20/06/2013, 17h56
  2. Récupérer fichier de type 'application/x-json' en cross-domain
    Par jdflaugergues dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/09/2010, 21h46
  3. Réponses: 6
    Dernier message: 13/01/2010, 17h29
  4. Réponses: 5
    Dernier message: 26/11/2008, 10h06
  5. Réponses: 1
    Dernier message: 05/08/2007, 14h46

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