web-dev-qa-db-fra.com

Récupère l'en-tête "Content-Type" de la demande dans PHP

J'implémente un service REST en PHP. Ce service devrait pouvoir prendre en charge plusieurs formats d'entrée et de sortie (JSON, XML). Pour cette raison, je veux vérifier les en-têtes de demande "Accepter" et "Content-Type" pour le type de contenu envoyé et demandé par le client.

Accéder à l'en-tête "Accepter" est aussi simple que d'utiliser $_SERVER['HTTP_ACCEPT']. Mais accéder à l'en-tête "Content-Type" semble être une tâche difficile. J'ai recherché la documentation PHP et le Web, mais la seule solution proposée était l'utilisation de la fonction PHP fonction Apache_request_headers() qui n'est prise en charge que lorsque PHP est installé en tant que module Apache, ce qui n'est pas vrai dans mon cas.

Alors ma question maintenant: comment puis-je accéder à l'en-tête "Content-Type" d'une demande?

44
CodeZombie

Les demandes normales (GET) n'ont pas de Content-Type entête. Pour les demandes POST, il apparaîtrait comme $_SERVER["CONTENT_TYPE"], avec une valeur comme multipart/form-data ou application/x-www-form-urlencoded.

Ceci est mandaté par la spécification CGI/1.1: http://www.ietf.org/rfc/rfc3875 .

54
mario

Vous devrez demander manuellement à Apache de fournir l'en-tête Content-Type (Ainsi que tous les autres en-têtes de votre choix).

Placez quelque chose comme ça dans votre fichier .htaccess Ou votre hôte virtuel:

RewriteEngine on
RewriteRule .* - [E=HTTP_CONTENT_TYPE:%{HTTP:Content-Type},L]

Et voila, vous venez de synthétiser votre propre $_SERVER['HTTP_CONTENT_TYPE']!

Modifier:

Je suppose que vous exécutez PHP en tant que CGI avec Apache afin que vous puissiez utiliser des verbes autres que GET et POST, comme le font la plupart des services de repos. Si vous utilisez un autre serveur Web ou en grande partie inconnu PHP SAPI, vous devrez utiliser une astuce similaire; PHP car CGI n'a tout simplement pas accès aux en-têtes de demande en dehors du contenu de $_SERVER, Quels que soient les autres mécanismes que vous utilisez - $_ENV, Apache_request_headers(), même les classes de l'extension php_http Seront toutes vides.

20
Neil E. Pearson

Vous pouvez également obtenir le type de contenu (comme "text/html") avec ceci:

echo split(',', getallheaders()['Accept'])[0];

ou

echo get_headers('http://127.0.0.1', 1)["Content-Type"]

Mise à jour

Comme Benjamin l'a dit, Apache_request_headers est disponible avec FastCGI depuis 5.4.0 et depuis le serveur interne PHP depuis 5.5.7.

5
Fabien Sa