On m'a demandé d'utiliser la méthode php://input
au lieu de $_POST
lors de l'interaction avec des demandes Ajax de JQuery. Ce que je ne comprends pas, ce sont les avantages d'utiliser ceci par rapport à la méthode globale de $_POST
ou $_GET
.
La raison en est que php://input
renvoie toutes les données brutes après les en-têtes HTTP de la demande, quel que soit le type de contenu.
Le PHP superglobal $_POST
, seul est censé encapsuler les données qui sont soit
application/x-www-form-urlencoded
(type de contenu standard pour les formulaires simples) oumultipart/form-data-encoded
(principalement utilisé pour les téléchargements de fichiers)En effet, ce sont les seuls types de contenu pour lesquels doit être pris en charge par les agents utilisateurs . Ainsi, le serveur et PHP ne s'attendent généralement pas à recevoir un autre type de contenu (ce qui ne veut pas dire qu'ils ne le pourraient pas).
Donc, si vous simplement POST un bon vieux HTML form
, la requête ressemble à ceci:
POST /page.php HTTP/1.1
key1=value1&key2=value2&key3=value3
Mais si vous travaillez beaucoup avec Ajax, cette probabilité inclut également l'échange de données plus complexes avec des types (string, int, bool) et des structures (tableaux, objets). JSON est donc le meilleur choix dans la plupart des cas. Mais une requête avec une charge JSON ressemblerait à ceci:
POST /page.php HTTP/1.1
{"key1":"value1","key2":"value2","key3":"value3"}
Le contenu serait maintenant application/json
(ou du moins aucun de ceux mentionnés ci-dessus), donc le $_POST
de PHP ne sait pas comment gérer cela (pour le moment).
Les données sont toujours là, vous ne pouvez simplement pas y accéder via l'encapsuleur. Vous devez donc aller le chercher vous-même au format brut avec file_get_contents('php://input')
( tant que ce n'est pas multipart/form-data
- codé ).
C'est également ainsi que vous accéderiez aux données XML ou à tout autre type de contenu non standard.
php://input
peut vous donner les octets bruts des données. Ceci est utile si les données POSTed sont une structure codée JSON, ce qui est souvent le cas pour une demande AJAX POST.
Voici une fonction pour faire exactement cela:
/**
* Returns the JSON encoded POST data, if any, as an object.
*
* @return Object|null
*/
private function retrieveJsonPostData()
{
// get the raw POST data
$rawData = file_get_contents("php://input");
// this returns null if not valid json
return json_decode($rawData);
}
Le tableau $_POST
est plus utile lorsque vous manipulez des données de valeur-clé à partir d'un formulaire, soumis par un POST traditionnel. Ceci ne fonctionne que si les données POSTed sont dans un format reconnu, généralement application/x-www-form-urlencoded
(voir http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4 pour plus de détails).
Si les données de publication sont mal formées, $ _POST ne contiendra rien. Pourtant, php: // input aura la chaîne malformée.
Par exemple, il existe des applications ajax qui ne forment pas une séquence post-valeur correcte pour le téléchargement d'un fichier et il suffit de vider tout le fichier en tant que données de post, sans nom de variable ni rien. $ _POST sera vide, $ _FILES vide également, et php: // input contiendra le fichier exact, écrit sous forme de chaîne.