accept - print curl request php
Obtener el encabezado de solicitud "Content-Type" en PHP (3)
Estoy implementando un servicio REST en PHP. Este servicio debería ser compatible con múltiples formatos de entrada y salida (JSON, XML). Por ese motivo, quiero verificar los encabezados de solicitud "Aceptar" y "Tipo de contenido" para el tipo de contenido enviado y solicitado por el cliente.
Acceder al encabezado "Aceptar" es tan simple como usar $_SERVER[''HTTP_ACCEPT'']
. Pero acceder al encabezado "Content-Type" parece ser una tarea difícil. Busqué en la documentación de PHP y en la web, pero la única solución ofrecida fue el uso de la función PHP apache_request_headers()
que solo se admite cuando PHP está instalado como un módulo de Apache, lo cual no es cierto en mi caso.
Entonces mi pregunta ahora: ¿cómo puedo acceder al encabezado "Content-Type" de una solicitud?
Las solicitudes normales (GET) no tienen un encabezado Content-Type
. Para las solicitudes POST, aparecería como $_SERVER["CONTENT_TYPE"]
, con un valor como multipart / form-data o application / x-www-form-urlencoded.
Esto es obligatorio por la especificación CGI / 1.1: http://www.ietf.org/rfc/rfc3875 .
También puede obtener el tipo de contenido (como "text / html") con esto:
echo split('','', getallheaders()[''Accept''])[0];
o
echo get_headers(''http://127.0.0.1'', 1)["Content-Type"]
Actualizar
Como dijo Benjamin, apache_request_headers
está disponible con FastCGI desde 5.4.0 y desde el servidor PHP interno desde 5.5.7.
Tendrá que instruir manualmente a Apache para que le proporcione el encabezado Content-Type
(más cualquier otro encabezado que desee).
Haga estallar algo como esto en su archivo .htaccess
o en su host virtual:
RewriteEngine on
RewriteRule .* - [E=HTTP_CONTENT_TYPE:%{HTTP:Content-Type},L]
Y listo, ¡acabas de sintetizar tu propio $_SERVER[''HTTP_CONTENT_TYPE'']
!
Editar:
Supongo que está ejecutando PHP como CGI con Apache para que pueda usar verbos además de GET y POST, como lo hacen la mayoría de los servicios de descanso. Si está utilizando otro servidor web o PHP SAPI sin precedentes, deberá usar un truco similar; PHP como CGI simplemente no tiene acceso a los encabezados de solicitud fuera del contenido de $_SERVER
, sin importar qué otros mecanismos use - $_ENV
, apache_request_headers()
, incluso las clases en la extensión php_http
estarán vacías.