使用HTTP DELETE方法时数据访问的RESTful问题

时间:2010-05-02 04:10:37

标签: php http rest

在使用HTTP DELETE指令访问脚本时,我遇到从PHP访问原始请求信息的问题。我正在使用一个使用Ajax访问脚本的JS前端。这个脚本实际上是我正在开发的RESTful API的一部分。

此示例中的端点是:

http://api.site.com/session

此端点用于生成可用于后续API请求的身份验证令牌。在此URL上使用GET方法以及HTTP基本身份验证的修改版本将为客户端提供访问令牌。然后,此令牌必须包含在与服务的所有其他交互中,直到它过期。

生成令牌后,会以客户发送服务的“Accept”标头指定的格式将其传回客户端;在这种情况下'application / json'。成功后,它会响应HTTP 200 Ok状态代码。失败时,它会使用HTTP 401 Authorization Required代码抛出异常。

现在,当您要删除会话或“注销”时,您使用HTTP DELETE指令搜索相同的URL。要验证对此端点的访问权限,客户端必须通过提供要终止的令牌来证明它们之前已经过身份验证。

如果他们“登录”,则会终止令牌和会话,并且服务应使用HTTP 204 No Content状态代码进行响应,否则,他们将再次受到401异常的欢迎。

现在,我遇到的问题是删除会话。使用带有Ajax的DELETE指令,一旦请求到达服务,我似乎无法访问我设置的任何参数。在这种情况下,我正在寻找名为'token'的参数。

我使用Firebug查看原始请求标头,我注意到'Content-Length'标头随着发送标记的大小而变化。这告诉我这些数据确实正在发送到服务器。

问题是,使用PHP,我如何获取参数信息?它不是POST或GET请求,因此我无法像在PHP中那样访问它。参数在请求的内容部分内。

我已经尝试查找$ _SERVER,但这显示了我有限的标头数量。我尝试了'apache_request_headers()',这给了我更详细的信息,但仍然只针对标题。我甚至试过'file_get_contents('php:// stdin');'我一无所获。

如何访问原始HTTP请求的内容部分?

对于冗长的帖子感到抱歉,但我认为太多的信息比太少了。 :)

2 个答案:

答案 0 :(得分:9)

我认为您滥用HTTP DELETE。它通常应该用作删除服务器上资源的请求:请求URI指向的资源。您可以将访问令牌编码为查询参数,但这不是DELETE的使用方式。例如,请求:

DELETE /somescript.php?token=XYZ123

应该被视为从服务器删除'somescript.php'文件的请求。

您应该重写系统以使用POST请求,这是执行此类操作的常用方法。 POST处理程序脚本可以删除会话并使用相应的标头进行回复,以取消设置您可能已创建的任何Cookie。

答案 1 :(得分:3)

要访问使用PUT和DELETE传递的参数,您必须解析php的'input'流,例如:

parse_str(file_get_contents('php://input'), $arguments);

希望有所帮助。