代码之家  ›  专栏  ›  技术社区  ›  Wilhelm Murdoch

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

  •  2
  • Wilhelm Murdoch  · 技术社区  · 15 年前

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

    本例中的端点为:

    http://api.site.com/session

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

    一旦生成了一个令牌,它将以客户机发送服务的“accept”头指定的格式返回给客户机;在本例中是“application/json”。成功后,它会用HTTP 200 OK状态代码响应。失败时,它使用HTTP401授权所需代码引发异常。

    现在,当您想要删除一个会话或“注销”时,您点击了相同的URL,但使用了HTTP DELETE指令。要验证对该端点的访问,客户端必须通过提供要终止的令牌来证明它们以前已经过身份验证。

    如果它们“登录”,则令牌和会话将终止,并且服务应使用HTTP 204无内容状态代码响应,否则,它们将再次收到401异常。

    现在,我遇到的问题是删除会话。使用delete指令,使用Ajax,当请求到达服务时,我似乎无法访问我设置的任何参数。在本例中,我正在查找名为“token”的参数。

    我使用Firebug查看原始请求头,注意到“内容长度”头随令牌的大小而变化。这告诉我这些数据确实被发送到服务器。

    问题是,使用PHP,我该如何访问参数信息?它不是一个POST或GET请求,所以我不能像在PHP中一样访问它。参数在请求的内容部分中。

    我试过在$_服务器中查找,但显示的头的数量有限。我尝试了“apache_request_headers()”,它提供了更详细的信息,但仍然只针对头部。我甚至尝试了“file_get_contents('php://stdin');”,但一无所获。

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

    抱歉,这篇冗长的文章,但我觉得信息太多总比信息太少好。:)

    2 回复  |  直到 15 年前
        1
  •  9
  •   Marc B    15 年前

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

    DELETE /somescript.php?token=XYZ123
    

    应该 作为从服务器中删除“somescript.php”文件的请求处理。

    您应该重写您的系统以使用POST请求,这是执行此类操作的常见方法。post-handler脚本可以删除会话并使用适当的头进行回复,以取消设置您可能创建的任何cookie。

        2
  •  3
  •   Drew    15 年前

    要访问put和delete传递的参数,必须解析php的“input”流,例如:

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

    希望有帮助。