file_get_contents ("php: // input") ou $ HTTP_RAW_POST_DATA, lequel est le meilleur pour obtenir le corps de la requête JSON?

120

file_get_contents("php://input")ou $HTTP_RAW_POST_DATA- lequel est le meilleur pour obtenir le corps de la requête JSON?

Et quel type de demande ( GETou POST) dois-je utiliser pour envoyer des données JSON lors de l'utilisation côté client XmlHTTPRequest?

Ma question est inspirée de cette réponse: Comment publier du JSON en PHP avec curl

Citation de cette réponse:

Du point de vue du protocole, file_get_contents("php://input")c'est en fait plus correct, puisque vous ne traitez pas vraiment les données de formulaire multipart http de toute façon.

Manuel Bitto
la source

Réponses:

195

php://inputVous permet en fait de lire les données POST brutes.

C'est une alternative moins gourmande en mémoire à $ HTTP_RAW_POST_DATA et ne nécessite aucune directive php.ini spéciale .

php://inputn'est pas disponible avec enctype="multipart/form-data".

Référence: http://php.net/manual/en/wrappers.php.php

zaf
la source
12
De plus, à partir de PHP 5.6, $HTTP_RAW_POST_DATAest considéré comme obsolète et php://inputpeut être réutilisé.
Chris Forrence
Voir aussi enable_post_data_reading.
Pacerier
json_decode (file_get_contents ('php: // input'), true) est-ce que cela prend en charge en PHP 7.1 pour obtenir les valeurs $ _GET de l'URL?
Kailas
$ HTTP_RAW_POST_DATA est obsolète depuis PHP 7
Daniel
15

php: // input est un flux en lecture seule qui vous permet de lire des données brutes à partir du corps de la requête. Dans le cas des requêtes POST, il est préférable d'utiliser l'entrée php: // au lieu de $ HTTP_RAW_POST_DATA car cela ne dépend pas des directives php.ini spéciales . De plus, pour les cas où $ HTTP_RAW_POST_DATA n'est pas renseigné par défaut, c'est une alternative potentiellement moins gourmande en mémoire que l'activation de always_populate_raw_post_data.

Source: http://php.net/manual/en/wrappers.php.php .

Zeeshan Hyder
la source
4
De plus, à partir de PHP 5.6, $HTTP_RAW_POST_DATAest considéré comme obsolète et php://inputpeut être réutilisé.
Chris Forrence
14

file_get_contents (php: // input) - récupère les données POST brutes et vous devez l'utiliser lorsque vous écrivez des API et avez besoin d'une entrée XML / JSON / ... qui ne peut pas être décodée en $ _POST par PHP un exemple:

envoyer par courrier JSON string

<input type="button" value= "click" onclick="fn()">
<script>
 function fn(){


    var js_obj = {plugin: 'jquery-json', version: 2.3};

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax({
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data){
    console.log(data);
  }

});

    }
</script>

1.php

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));
zloctb
la source
3

Les règles habituelles doivent s'appliquer à la manière dont vous envoyez la demande. Si la requête est de récupérer des informations (par exemple un résultat de recherche partielle «indice», ou une nouvelle page à afficher, etc ...), vous pouvez utiliser GET. Si les données envoyées font partie d'une demande de changement (mise à jour d'une base de données, suppression d'un enregistrement, etc.) alors utilisez POST.

Côté serveur, il n'y a aucune raison d'utiliser l'entrée brute, à moins que vous ne souhaitiez récupérer l'intégralité du bloc de publication / récupération de données en une seule fois. Vous pouvez récupérer les informations spécifiques que vous souhaitez via les tableaux _GET / _POST comme d'habitude. Les bibliothèques AJAX telles que MooTools / jQuery géreront la partie la plus difficile de faire les appels AJAX réels et d'encoder les données de formulaire dans les formats appropriés pour vous.

Marc B
la source
C'est le point: je veux saisir l'intégralité du bloc de données post / get en une seule fois, car JSON est un format sans variable, il ne représente que les données.
Manuel Bitto
@Kucebe Je ne vois pas pourquoi cela est nécessaire, pourquoi ne pas mettre les données JSON dans un champ POST et en finir?
Pekka
Si vous voulez le bloc JSON entier, alors pourquoi ne pas attribuer le bloc de texte JSON à un champ de formulaire et le soumettre comme ça? <input type="hidden" name="data" value="json data here" />est tout à fait acceptable et vous permet de le récupérer de manière simple côté serveur avec $ _REQUEST ['data'].
Marc B
3
L'intégration de JSON dans un champ POST va à l'encontre de l'objectif de la balise de type de contenu HTTP et n'est pas aussi pratique pour le débogage dans Fiddler et les débogueurs de navigateur (qui peuvent comprendre JSON). De plus, de nombreuses bibliothèques JavaScript tierces POSTENT des charges utiles JSON en tant qu'application / json.
CyberMonk
2

Pour les données JSON, il est beaucoup plus facile de les POSTER en tant que type de contenu "application / json". Si vous utilisez GET, vous devez encoder en URL le JSON dans un paramètre et c'est un peu compliqué. De plus, il n'y a pas de limite de taille lorsque vous effectuez un POST. La taille de GET est très limitée (4K au maximum).

Codeur ZZ
la source
2
Il y a souvent une limite de taille pour POST, mais elle est généralement assez élevée. Vérifiez votre php.ini.
Brad
2

Votre deuxième question est simple, GET a une limite de taille de 1 à 2 kilo-octets à la fois du côté du serveur et du navigateur, donc tout type de plus grandes quantités de données que vous auriez à envoyer via POST.

Pekka
la source