2010-05-02 27 views
2

我在使用HTTP DELETE指令訪問腳本時訪問來自PHP的原始請求信息時出現問題。我正在使用一個使用Ajax訪問腳本的JS前端。這個腳本實際上是我正在開發的RESTful API的一部分。使用HTTP DELETE方法時數據訪問的RESTful問題

在此示例中的端點是:

http://api.site.com/session

此端點被用來產生可以用於後續的API請求的認證令牌。在此URL上使用GET方法以及HTTP基本認證的修改版本將爲客戶端提供訪問令牌。這個令牌必須包含在與服務的所有其他交互中,直到它到期。

一旦生成令牌,它被傳遞迴客戶端在由指定的格式「接受」由客戶端向服務報頭;在這種情況下'application/json'。一旦成功,它將以HTTP 200 Ok狀態碼進行響應。失敗時,它會使用HTTP 401授權必需代碼引發異常。

現在,當你想刪除一個會話,或「註銷」,你打相同的URL,但與HTTP DELETE指令。要驗證對該端點的訪問權限,客戶端必須證明他們之前已通過提供他們想要終止的令牌進行身份驗證。

如果他們「登錄」,令牌和會話終止和服務應與HTTP 204無內容狀態碼,否則,它們與401例外再次映入眼簾。

現在,我遇到的問題是刪除會話。通過DELETE指令,使用Ajax,我似乎無法訪問我請求訪問服務時設置的任何參數。在這種情況下,我正在尋找名爲'token'的參數。

我看使用螢火蟲原始請求頭和我注意到「的Content-Length」與令牌的大小標頭的變化被髮送。這告訴我這個數據確實被髮送到服務器。

問題是,使用PHP,我該如何訪問參數信息?這不是POST或GET請求,所以我無法像在PHP中一樣訪問它。這些參數在請求的內容部分內。

我試圖尋找在$ _ SERVER,但顯示我頭量有限。我嘗試了'apache_request_headers()',它給了我更詳細的信息,但仍然只用於標題。我甚至嘗試過'file_get_contents('php:// stdin');'我什麼也得不到。

如何訪問原始HTTP請求的內容部分?

對不起,冗長的職位,但我想通了太多信息比太少更好。 :)

+0

如果這是不可能的,我總是這樣的: DELETE http://api.site.com/session/dDI3w3dsd9fsdle 其中「dDI3w3dsd9fsdle」是認證令牌。不過,我寧願不要在URL中公開它。 – 2010-05-02 04:23:30

回答

9

我認爲你濫用HTTP DELETE。它通常應該用作刪除服務器資源的請求:請求URI指向的資源。您可以將訪問令牌編碼爲查詢參數,但這不是應該如何使用DELETE。 e.g,的請求:

DELETE /somescript.php?token=XYZ123 

應該被當作刪除從服務器「somescript.php」文件的請求。

您應該重寫系統以使用POST請求,這是執行此類操作的常用方法。 POST處理程序腳本可以刪除會話並回復相應的標題以取消設置您可能創建的任何Cookie。

+0

啊,但我試圖刪除服務器上的資源;在提供的令牌內關聯的實際會話記錄。不過,我明白你的意思。事實證明,奇怪的是,與DELETE指令一起發送的參數ARE實際上存儲在$ _POST數組中。奇怪,因爲我可以發誓我已經看過那裏。謝啦! – 2010-05-02 04:58:46

+4

從客戶端的角度來看,'DELETE /somescript.php?token = XYZ123'是刪除資源'/somescript.php?token = XYZ123'而不是'/ somescript.php'的請求。網址對客戶來說是不透明的。 – 2010-05-02 13:06:05

3

要訪問與PUT傳遞的參數和DELETE,你必須解析PHP的「輸入」流,例如:

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

希望有所幫助。