2011-04-01 7 views
39

Sto implementando un servizio REST in PHP. Questo servizio dovrebbe essere in grado di supportare più formati di input e output (JSON, XML). Per questo motivo voglio controllare le intestazioni di richiesta "Accetta" e "Content-Type" per il tipo di contenuto inviato e richiesto dal cliente.Ottieni l'intestazione "Content-Type" della richiesta in PHP

Accesso a L'intestazione "Accetta" è semplice come utilizzare $_SERVER['HTTP_ACCEPT']. Ma l'accesso all'intestazione "Content-Type" sembra un compito difficile. Ho cercato la documentazione PHP e il web, ma l'unica soluzione offerta era l'uso della funzione PHP apache_request_headers() che è supportata solo quando PHP è installato come modulo Apache, il che non è vero nel mio caso.

Quindi la mia domanda ora: Come posso accedere al header "Content-Type" di una richiesta?

+0

Ricorda che '$ _SERVER [" CONTENT_TYPE "]' non è sempre disponibile. –

risposta

47

Normal (GET) richieste non hanno un colpo di testa Content-Type. Per le richieste POST appare come $_SERVER["CONTENT_TYPE"], con un valore come multipart/form-data o application/x-www-form-urlencoded.

Questo è ordinato dalla specifica CGI/1.1: http://www.ietf.org/rfc/rfc3875.

+6

Esiste un rapporto sui bug documentato per il server PHP integrato. Dovrebbe restituire 'CONTENT_TYPE', ma restituisce' HTTP_CONTENT_TYPE'. Speriamo che sia risolto nel prossimo futuro. https://bugs.php.net/bug.php?id=66606&thanks=6 –

18

È necessario indicare manualmente Apache per fornire il Content-Type intestazione (più eventuali altre intestazioni che si desidera).

qualcosa di pop come questo nel file .htaccess o host virtuale:

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

E voilà, basta sintetizzato il vostro molto proprio $_SERVER['HTTP_CONTENT_TYPE']!

Edit:

Presumo si sta eseguendo PHP come CGI con Apache in modo da poter usare i verbi diversi da GET e POST, come la maggior parte dei servizi di riposo fanno. Se stai usando un altro server web o SAPI PHP inaudito, dovrai usare un trucco simile; PHP come CGI semplicemente non ha accesso alle intestazioni di richiesta al di fuori dei contenuti del $_SERVER, non importa quali altri meccanismi si utilizza - $_ENV, apache_request_headers(), anche le classi nell'estensione php_http saranno tutti vuoti.

+0

Grazie, l'ha fatto!Sono impressionato :-) – CodeZombie

+0

Problema di vecchia data con i servizi REST su piattaforme PHP/Apache. Faccio un punto di distribuzione del vhost con l'applicazione perché di solito diventano piuttosto pesanti. Lieto che funzionasse :) –

+0

@ NeilE.Pearson C'è un modo per consentire 'charset' nell'intestazione? Sono [avendo problemi] (http://stackoverflow.com/questions/21720797/oauth-server-and-content-type-header) con esso accettandolo. –

4

È anche possibile ottenere il tipo di contenuto (come "text/html") con questo:

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

o

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

Aggiornamento

come Benjamin ha detto , apache_request_headers è disponibile con FastCGI dalla 5.4.0 e da inte rn server PHP dal 5.5.7.

+1

Grazie per le informazioni. Dalla documentazione: "Queste funzioni sono disponibili solo quando si esegue PHP come modulo Apache.". Per quanto ne so, PHP viene spesso utilizzato con FastCGI. Questo è esattamente il caso nel mio scenario. Preferisco personalmente '$ _SERVER [" CONTENT_TYPE "]', sembra molto più pulito. – CodeZombie

+2

Si noti che 'apache_request_headers()' è disponibile in FastCGI da PHP 5.4.0 – Benjamin

+1

e dal server interno PHP dal 5.5.7. Risposta aggiornata! –

Problemi correlati