web-dev-qa-db-fra.com

Quand utiliser l'en-tête ('Content-Type: application/json') dans PHP

J'ai essayé de comprendre quelle est vraiment l'utilisation de header('Content-Type: application/json') dans les scripts php et j'ai trouvé différentes questions et réponses sur stackoverflow à ce sujet mais je ne comprends toujours pas complètement ...

Alors voici la question: j'ai vu dans certains projets php cette ligne de code, et j'essaie de comprendre 

  • si cela est utilisé quand une autre page web appelle ce script (avec ajax par exemple) pour que la page appelante puisse obtenir un json de la page php

OU 

  • si ce script signifie que la page php va traiter avec JSON envoyé depuis une autre page Web. Ou peut-être autre chose ???

Une autre chose qui pourrait m'aider à obtenir une réponse, c’est récemment que j’ai récupéré json d’une ressource (URL externe) avec cURL et que j’ai dû mettre cet en-tête (Content-type: application/json) dans la requête. Ai-je envoyé cet en-tête à la ressource exertnal ou s'agissait-il de cet en-tête afin que je puisse traiter le JSON renvoyé?

merci

4
naspy971

Ok pour ceux qui sont intéressés, j'ai finalement compris que header('Content-Type: application/json') est utilisé quand une autre page appelle le script php, de sorte que l’autre page puisse automatiquement analyser le résultat en tant que json .

Par exemple, j'ai dans mon test.php: 

header('Content-type: application/json; charset=utf-8');
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo json_encode($arr); // {"a":1,"b":2,"c":3,"d":4,"e":5}

et dans mon main.js

function test() {
    $.ajax({
        url: 'test.php',
        type: 'GET',
        //dataType: 'html',
        success: function (response) {
            alert(response);
        }
    });
};

Quand je n'ai pas dataType défini sur "json" ou quand je n'ai pas d'en-tête dans mon test.php, l'alerte donne {"a":1,"b":2,"c":3,"d":4,"e":5} qui est une chaîne (essayé avec typeof (réponse), et quand j'ai cet en-tête, ou dataType : "json", je reçois [object Object] de l'alerte. Cette fonction d'en-tête est donc là pour indiquer aux pages appelantes le type de données qu'elle restitue, afin que vous sachiez comment vous en occuper. Dans mon script, si je ne Je n'ai pas header('Content-Type: application/json'), je devrais analyser la réponse dans le javascript comme ceci: JSON.parse(response) pour en faire un json, mais avec cet en-tête, j'ai déjà un objet json, et je peux l'analyser en HTML avec jSON.stringify(response).

6
naspy971

Vous devez toujours définir le Content-Type pour toute réponse HTTP afin de décrire ce que vous fournissez dans cette réponse.

Que ce soit du JSON ou autre chose, et que ce soit pour une demande AJAX ou pour tout autre type de demande.


Vous devez également définir le Content-Type pour toute demande pour décrire votre charge utile POST.

1
SLaks

Description W3 pour le type de contenu

Le champ Content-Type a pour objet de décrire suffisamment les données contenues dans le corps pour que l'agent utilisateur destinataire puisse choisir un agent ou un mécanisme approprié pour présenter les données à l'utilisateur ou, au contraire, les traiter de manière appropriée.

Bref, il suffit d’informer le destinataire du type de données qu’il a reçues et de les consommer en conséquence.

0

En PHP, si vous ne spécifiez pas l'en-tête Content-Type dans le script, il utilisera par défaut ce que vous avez configuré default-mimetype pour figurer dans votre fichier php.ini qui est généralement text/html.

L'appel de header('Content-Type: application/json') remplacera ce paramètre par défaut afin que le script réponde avec ce Content-Type à la demande.

De même, lorsque vous appelez curl avec un en-tête Content-type:application/json, vous spécifiez le type de contenu pour le corps de votre demande et non pour la réponse attendue.

0
JoshA