print accept php http rest http-headers

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.