Tout d'abord, une vérité de base sur PHP.
PHP n'a pas été conçu pour vous donner explicitement une interface de type REST pur (GET, POST, PUT, PATCH, DELETE) pour gérer les requêtes HTTP .
Cependant, la $_POST
, $_GET
et$_FILES
superglobales , et la fonction filter_input_array()
sont très utiles pour les besoins simples / de la personne moyenne.
L'avantage caché numéro un de $_POST
(et $_GET
) est que vos données d'entrée sont urldécodées automatiquement par PHP . Vous ne pensez même jamais à le faire, en particulier pour les paramètres de chaîne de requête dans une demande GET standard.
Cependant, vous en apprendrez plus ...
Cela étant dit, à mesure que vous progressez dans vos connaissances en programmation et que vous souhaitez utiliser l' XmlHttpRequest
objet JavaScript (jQuery pour certains), vous voyez la limitation de ce schéma.
$_POST
vous limite à l'utilisation de deux types de supports dans HTTP Content-Type
tête :
application/x-www-form-urlencoded
, et
multipart/form-data
Ainsi, si vous voulez envoyer des valeurs de données à PHP sur le serveur et les faire apparaître dans le $_POST
superglobal , vous devez encoder du côté client et envoyer ces données sous forme de paires clé / valeur - une étape peu pratique pour les novices (en particulier lorsque vous essayez de déterminer si différentes parties de l'URL nécessitent différentes formes de codage d'URL: normal, brut, etc.).
Pour tous les utilisateurs jQuery, la $.ajax()
méthode consiste à convertir votre JSON en paires clé / valeur encodées URL avant de les transmettre au serveur. Vous pouvez remplacer ce comportement en définissant processData: false
. Il suffit de lire le $ .ajax () et n'oubliez pas d'envoyer le bon type de média dans l'en-tête Content-Type.
Encodage URL? Que diable!!!???
En règle générale, si vous effectuez une requête HTTP normale et synchrone (lorsque toute la page est redessinée) avec un formulaire HTML, l'agent utilisateur (navigateur Web) encodera automatiquement vos données de formulaire pour vous. Si vous souhaitez effectuer une requête HTTP asynchrone à l'aide de l' XmlHttpRequest
objet, vous devez créer une chaîne codée en url et l'envoyer, si vous souhaitez que ces données s'affichent dans le $_POST
superglobal .
Comment êtes-vous en contact avec JavaScript? :-)
La conversion d'un tableau ou d'un objet JavaScript en une chaîne encodée en url dérange de nombreux développeurs (même avec de nouvelles API comme Form Data ). Ils préfèreraient de loin envoyer JSON, et ce serait plus efficace pour le code client de le faire.
Rappelez-vous (clin d’œil, clin d’œil), le développeur Web moyen n’apprend pas à utiliser XmlHttpRequest
directement objet, les fonctions globales, les fonctions de chaîne, les fonctions de tableau et les expressions régulières comme vous et moi ;-). Le codage url pour eux est un cauchemar. ;-)
PHP, qu'est-ce qui donne?
Le manque de PHP de gestion XML et JSON intuitive décourage de nombreuses personnes. On pourrait penser qu'il ferait désormais partie de PHP (soupir).
Tant de types de médias (types MIME dans le passé)
XML, JSON et YAML ont tous des types de médias qui peuvent être placés dans un en- Content-Type
tête HTTP .
- application / xml
- applicaiton / json
- application / yaml (bien que l'IANA n'ait aucune désignation officielle répertoriée)
Regardez combien de types de médias (anciennement, les types MIME) sont définis par l'IANA.
Regardez combien il y a d'en- têtes HTTP .
php: // entrée ou buste
L'utilisation du php://input
flux vous permet de contourner le niveau d'abstraction baby-sitting / hand holding que PHP a imposé au monde. :-) Un grand pouvoir implique de grandes responsabilités!
Maintenant, avant de traiter les valeurs de données transmises en continu php://input
, vous devez / devez faire quelques choses.
- Déterminez si la bonne méthode HTTP a été indiquée (GET, POST, PUT, PATCH, DELETE, ...)
- Déterminez si l'en - tête HTTP Content-Type a été transmis.
- Déterminez si la valeur du Content-Type est le type de support souhaité.
- Déterminez si les données envoyées sont bien formées XML / JSON / YMAL / etc.
- Si nécessaire, convertissez les données en un type de données PHP: tableau ou objet.
- Si l'une de ces vérifications ou conversions de base échoue, jetez une exception !
Et l'encodage des caractères?
AH, HA! Oui, vous souhaiterez peut-être que le flux de données envoyé dans votre application soit encodé en UTF-8, mais comment savoir s'il l'est ou non?
Deux problèmes critiques.
- Vous ne savez pas combien de données transitent
php://input
.
- Vous ne connaissez pas avec certitude l'encodage actuel du flux de données.
Allez-vous essayer de gérer les données de flux sans savoir combien il y a d'abord? C'est une terrible idée . Vous ne pouvez pas vous fier exclusivement à l'en- Content-Length
tête HTTP pour obtenir des conseils sur la taille de l'entrée diffusée, car elle peut être usurpée.
Vous allez avoir besoin d'un:
- Algorithme de détection de la taille du flux.
- Limites de taille de flux définies par l'application (les limites Apache / Nginx / PHP peuvent être trop larges).
Allez-vous tenter de convertir des données de flux en UTF-8 sans connaître l'encodage actuel du flux? Comment? Le filtre de flux iconv ( exemple de filtre de flux iconv ) semble vouloir un encodage de début et de fin, comme celui-ci.
'convert.iconv.ISO-8859-1/UTF-8'
Ainsi, si vous êtes consciencieux, vous aurez besoin de:
- Algorithme de détection de codage de flux.
- Algorithme de définition de filtre de flux dynamique / d'exécution (car vous ne pouvez pas connaître le codage de départ a priori).
( Mise à jour : 'convert.iconv.UTF-8/UTF-8'
forcera tout à UTF-8, mais vous devez toujours tenir compte des caractères que la bibliothèque iconv peut ne pas savoir traduire. En d'autres termes, vous devez savoir comment définir l'action à entreprendre lorsqu'un caractère ne peut pas être traduit : 1) Insérez un caractère fictif, 2) Échec / lancer et exception).
Vous ne pouvez pas vous fier exclusivement à l'en- Content-Encoding
tête HTTP , car cela pourrait indiquer quelque chose comme la compression comme ci-dessous. Ce n'est pas de cela que vous voulez prendre une décision concernant iconv.
Content-Encoding: gzip
Par conséquent, les étapes générales pourraient être ...
Partie I: liée à la demande HTTP
- Déterminez si la bonne méthode HTTP a été indiquée (GET, POST, PUT, PATCH, DELETE, ...)
- Déterminez si l'en - tête HTTP Content-Type a été transmis.
- Déterminez si la valeur du Content-Type est le type de support souhaité.
Partie II: Données liées au flux
- Déterminez la taille du flux d'entrée (facultatif, mais recommandé).
- Déterminez l'encodage du flux d'entrée.
- Si nécessaire, convertissez le flux d'entrée en encodage de caractères souhaité (UTF-8).
- Si nécessaire, inversez toute compression ou chiffrement au niveau de l'application, puis répétez les étapes 4, 5 et 6.
Partie III: liée au type de données
- Déterminez si les données envoyées sont bien formées XML / JSON / YMAL / etc.
(N'oubliez pas, les données peuvent toujours être une chaîne codée URL que vous devez ensuite analyser et décoder URL).
- Si nécessaire, convertissez les données en un type de données PHP: tableau ou objet.
Partie IV: Valeur des données liées
Filtrez les données d'entrée.
Validez les données d'entrée.
Voyez-vous maintenant?
Le $_POST
superglobal, ainsi que les paramètres php.ini pour les limites d'entrée, sont plus simples pour le profane. Cependant, le traitement de l'encodage de caractères est beaucoup plus intuitif et efficace lors de l'utilisation de flux car il n'est pas nécessaire de parcourir les superglobales (ou les tableaux, en général) pour vérifier les valeurs d'entrée pour l'encodage approprié.