我正在用PHP实现REST服务。该服务应该能够支持多种输入和输出格式(JSON,XML)。出于这个原因,我想检查请求标题“接受”和“内容类型”,了解客户发送和请求的内容类型。
访问“接受”标头非常简单,只需使用$_SERVER['HTTP_ACCEPT']
即可。但访问“Content-Type”标题似乎是一项艰巨的任务。我搜索了PHP文档和Web,但提供的唯一解决方案是使用PHP函数apache_request_headers()
,仅当PHP作为Apache模块安装时才支持该函数,在我的情况下不是这样。
现在我的问题是:如何访问请求的标题“Content-Type”?
答案 0 :(得分:54)
正常(GET)请求没有Content-Type
标头。对于POST请求,它将显示为 $_SERVER["CONTENT_TYPE"]
,其值类似于multipart / form-data或application / x-www-form-urlencoded。
这是CGI / 1.1规范要求的:http://www.ietf.org/rfc/rfc3875。
答案 1 :(得分:20)
您需要手动指示Apache提供Content-Type
标头(以及您想要的任何其他标头)。
在.htaccess
文件或虚拟主机中弹出类似内容:
RewriteEngine on
RewriteRule .* - [E=HTTP_CONTENT_TYPE:%{HTTP:Content-Type},L]
瞧,你刚刚合成了自己的$_SERVER['HTTP_CONTENT_TYPE']
!
修改强>
我假设您使用Apache运行PHP作为CGI,因此您可以使用除GET和POST之外的动词,就像大多数其他服务一样。如果您正在使用其他Web服务器或者基本上闻所未闻的PHP SAPI,您将需要使用类似的技巧; PHP作为CGI根本无法访问$_SERVER
内容之外的请求标头,无论您使用哪种其他机制 - $_ENV
,apache_request_headers()
,甚至{{1}中的类扩展名都是空的。
答案 2 :(得分:5)
您还可以使用以下内容获取内容类型(例如“text / html”):
echo split(',', getallheaders()['Accept'])[0];
或
echo get_headers('http://127.0.0.1', 1)["Content-Type"]
更新
就像Benjamin所说,apache_request_headers
可用于5.4.0的FastCGI和5.5.7以来的内部PHP服务器。