web-dev-qa-db-fra.com

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

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

Et quel type de requête (GET ou POST) dois-je utiliser pour envoyer des données JSON lors de l'utilisation du côté client XmlHTTPRequest?

Ma question s'inspire de cette réponse: Comment publier du JSON sur PHP avec curl

Citation de cette réponse:

D'un point de vue protocole, file_get_contents("php://input") est en réalité plus correct, car vous ne traitez pas vraiment de données de formulaire multipart http.

108
Manuel Bitto

En fait, php://input vous permet de lire des données brutes POST.

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

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

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

185
zaf

php: // input est un flux en lecture seule qui vous permet de lire des données brutes à partir du corps de la demande. Dans le cas de POST requêtes, il est préférable d'utiliser php: // input au lieu de $ HTTP_RAW_POST_DATA car cela ne dépend pas de directives php.ini spéciales . De plus, dans les cas où $ HTTP_RAW_POST_DATA n'est pas renseigné par défaut, il s'agit d'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 .

13
Zeeshan Hyder

file_get_contents (php: // input) - récupère les données raw POST et vous devez les utiliser lorsque vous écrivez des API et que vous avez besoin d'entrées XML/JSON/... qui ne peuvent pas être décodées en $ _POST by PHP quelques exemples:

envoyer par la poste chaîne JSON

<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'));
9
zloctb

Les règles habituelles doivent s'appliquer à la manière dont vous envoyez la demande. Si la demande consiste à récupérer des informations (par exemple, un résultat de "recherche" partielle, ou une nouvelle page à afficher, etc.), vous pouvez utiliser GET. Si les données envoyées font partie d'une demande de modification (mise à jour d'une base de données, suppression d'un enregistrement, etc.), 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 souhaitées via les tableaux _GET/_POST comme d’habitude. Les bibliothèques AJAX telles que MooTools/jQuery gèrent le plus difficile des appels AJAX actuels et du codage des données de formulaire dans des formats appropriés.

3
Marc B

Votre deuxième question est simple: GET a une taille limite de 1 à 2 kilo-octets, tant du côté serveur que du navigateur. Vous pouvez donc envoyer des quantités plus importantes de données via POST.

2
Pekka 웃

Pour les données JSON, il est beaucoup plus facile de POST -le en tant que type de contenu "application/json". Si vous utilisez GET, vous devez coder l'URL du code JSON dans un paramètre, ce qui est plutôt compliqué. En outre, 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 plus).

2
ZZ Coder