2010-10-05 62 views
3

我正在編寫一個API,並希望遵循REST方法。據我瞭解,如果我想讓API用戶更新特定記錄,應該支持PUT http://server/specific _resource類型的請求。當然,他們沒有做GET,他們需要傳遞新的數據,我的問題是如何做到這一點(在我的具體情況下,只更新指定記錄的一些字段,但這不是那麼相關這裏)。我可以想到兩種方法:在請求正文中使用curl:curl -X PUT -d "key=value" http://server/specific _resource或查詢字符串(使用curl:curl -X PUT http://server/specific _resource?key=value)。PHP REST API如何接收PUTted數據?

不幸的是,無論我採取什麼方法,看起來很難獲得所提供的數據。問題似乎是PHP只能真正完全理解兩種HTTP方法,即GETPOST,以及PUT considered to be for file uploads。如果我將數據包含在body中,那麼訪問它的唯一方法似乎是via an fopen('php://input') call。例如,http_get_request_body()不提供數據。同樣,這些信息也不能在超全球的$_REQUEST中找到。如果我不想用fopen('php://input')處理原始請求主體,那麼看起來我必須將數據作爲查詢字符串參數發送,因爲數據將作爲超全球的$_GET(以及$_REQUEST)的元素出現。

我特別使用CakePHP,它似乎只在我的控制器方法if the request was a POST中填充params數組的form數組。查詢字符串參數放在params'url數組中,而不管請求方法如果在請求URL中使用。毫不奇怪,我是not the only one誰遇到了這個問題。

你會建議什麼解決方案?處理輸入流?使用查詢字符串參數?請忘記PUT動詞並用POST代替?

+0

我想說這是CakePHP中的失敗,而不是過程。從'php:// input'讀取沒有什麼不妥,很容易完成,需要什麼解析取決於內容發送,這取決於您收到的Content-Type頭。只需發送原始的JSON,原始的XML,任何生的東西,它會工作得很好。雖然從未使用過CakePHP,所以它可能只是一個隱藏功能。 – Wrikken 2010-10-05 00:50:22

+0

對我來說,只有它繼承了PHP對HTTP請求中傳遞的數據的方法時,才感覺像CakePHP的失敗。 – pr1001 2010-10-05 01:05:01

回答

2
+0

所以你的答案是,是的,使用'PUT'然後解析請求體? – pr1001 2010-10-05 00:58:03

+0

是的,你可以使用POST而不是PUT,但是如果你不使用PUT,你並沒有充分利用RESTful接口。通常PUT用於更新現有資源(//服務器/資源),POST用於創建新資源(//服務器)。 – 2010-10-05 10:40:52

+0

同意,這就是爲什麼我想要PUT,我只是想確保我在這裏不過分教條。 – pr1001 2010-10-05 21:03:52

0

使用服務器http方法變量來檢查它是否是PUT。

我sugget你看看SLIM的源代碼,以檢查他們如何處理它

歡呼!