Cod*_*bie 45 php rest http http-headers
我正在用PHP实现REST服务.该服务应该能够支持多种输入和输出格式(JSON,XML).出于这个原因,我想检查请求标题"Accept"和"Content-Type",了解客户端发送和请求的内容类型.
访问"Accept"标题非常简单$_SERVER['HTTP_ACCEPT'].但访问"Content-Type"标题似乎是一项艰巨的任务.我搜索了PHP文档和Web,但唯一提供的解决方案是使用PHP函数apache_request_headers(),只有当PHP作为Apache模块安装时才支持,这在我的情况下是不正确的.
所以现在我的问题是:如何访问请求的标题"Content-Type"?
mar*_*rio 56
普通(GET)请求没有Content-Type标头.对于POST请求,它将显示为$_SERVER["CONTENT_TYPE"],具有类似multipart/form-data或application/x-www-form-urlencoded的值.
这是由CGI/1.1规范强制要求的:http://www.ietf.org/rfc/rfc3875.
Nei*_*son 20
您需要手动指示Apache提供Content-Type标头(以及您想要的任何其他标头).
在您的.htaccess文件或虚拟主机中弹出类似的内容:
RewriteEngine on
RewriteRule .* - [E=HTTP_CONTENT_TYPE:%{HTTP:Content-Type},L]
Run Code Online (Sandbox Code Playgroud)
瞧,你刚刚合成了自己的$_SERVER['HTTP_CONTENT_TYPE']!
编辑:
我假设您使用Apache将PHP作为CGI运行,因此您可以使用除GET和POST之外的动词,就像大多数其他服务一样.如果您正在使用其他Web服务器或者基本上闻所未闻的PHP SAPI,您将需要使用类似的技巧; PHP作为CGI根本没有获得要求的内容外头$_SERVER,不管你用什么样的机制- $_ENV,apache_request_headers()即使在类php_http的扩展都将是空的.
您还可以使用以下内容获取内容类型(如"text/html"):
echo split(',', getallheaders()['Accept'])[0];
Run Code Online (Sandbox Code Playgroud)
要么
echo get_headers('http://127.0.0.1', 1)["Content-Type"]
Run Code Online (Sandbox Code Playgroud)
更新
就像Benjamin所说,apache_request_headers可以从5.4.0获得FastCGI,从5.5.7开始提供内部PHP服务器.
| 归档时间: |
|
| 查看次数: |
79396 次 |
| 最近记录: |