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.
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
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.
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'));
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.
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.
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).