Obtenez de l' “Content-Type” en-tête de la requête en PHP
Je me suis mise en œuvre d'un service REST en PHP. Ce service devrait être en mesure de prendre en charge plusieurs formats d'entrée /sortie (JSON, XML). Pour cette raison, je veux vérifier les en-têtes de requête "Accepter" et "Content-Type" pour le type de contenu envoyé et demandé par le client.
Accès à la "Accepter" en-tête est aussi simple que l'utilisation de $_SERVER['HTTP_ACCEPT']
. Mais l'accès à la "Content-Type" en-tête semble être une tâche difficile. J'ai cherché dans la documentation de PHP et le web, mais la seule solution proposée est l'utilisation de la fonction PHP apache_request_headers()
qui est pris en charge uniquement lorsque PHP est installé en tant que module Apache, qui n'est pas vrai dans mon cas.
Donc ma question maintenant: Comment puis-je accéder à l'en-tête "Content-Type" d'une demande d'?
- Rappelez-vous que
$_SERVER["CONTENT_TYPE"]
n'est pas toujours disponible.
Vous devez vous connecter pour publier un commentaire.
Normal (GET) les demandes n'ont pas de
Content-Type
en-tête. Pour les requêtes POST, il semblerait que$_SERVER["CONTENT_TYPE"]
, avec une valeur comme de type multipart/form-data ou de l'application/x-www-form-urlencoded.C'est mandaté par le CGI/1.1: http://www.ietf.org/rfc/rfc3875.
CONTENT_TYPE
mais au lieu de cela renvoieHTTP_CONTENT_TYPE
. Nous espérons que ses corrigé dans un avenir proche. bugs.php.net/bug.php?id=66606&merci=6Vous aurez besoin de charger manuellement Apache pour l'alimentation de l'
Content-Type
en-tête (ainsi que tous les autres en-têtes que vous voulez).Pop quelque chose comme ceci dans votre
.htaccess
fichier ou de l'hôte virtuel:Et le tour est joué, vous venez de synthèse, votre très propre
$_SERVER['HTTP_CONTENT_TYPE']
!Edit:
Je suppose que vous utilisez PHP comme CGI avec Apache, donc vous pouvez utiliser des verbes autres que GET et POST, comme la plupart des services reste à faire. Si vous utilisez un autre serveur web ou en grande partie inédite PHP SAPI, vous aurez besoin d'utiliser une astuce similaire; PHP comme CGI simplement n'ont pas accès aux en-têtes de requête à l'extérieur le contenu de
$_SERVER
, peu importe ce que d'autres mécanismes que vous utilisez -$_ENV
,apache_request_headers()
, même les classes dans lephp_http
extension va tous être vide.charset
dans l'en-tête? Je suis d'avoir des problèmes avec elle de l'accepter.SetEnvIfNoCase ^Content-Type "(.+)" CONTENT_TYPE=$1
Vous pouvez également obtenir le type de contenu (tels que "text/html") avec ceci :
ou
Mise à jour
Comme dit Benjamin,
apache_request_headers
est disponible avec FastCGI de 5.4.0 et internes serveur PHP depuis 5.5.7.$_SERVER["CONTENT_TYPE"]
, il semble beaucoup plus propre.apache_request_headers()
est disponible sous FastCGI depuis PHP 5.4.0