2013-08-01 88 views
2

我一直在研究/創建一個REST api,在backbone.js到php上下文中。REST API請求方法輸入參數

我明白HTTP動詞的概念,並當他們應使用

GET - select

POST - create

PUT - update

DELETE - delete

我也明白傳遞一個標識符的概念作爲語義網址,例如

GET http://api/users/123

DELETE http://api/users/123

在這些情況下, 「123」 是id的業務邏輯將使用獲得/刪除用戶。

但是POST和PUT上下文呢?發送請求時

PUT http://api/users/123

的API將更新用戶ID 123提供的參數,這裏就是我的問題出現了。

我會假設輸入參數更新將作爲PUT參數發送。在PHP語法中,這表示爲:file_get_contents('php://input')(這與刪除請求相同)。

當通過backbone.js測試此功能時,它的工作原理完美。

但是當我嘗試並用

POST http://api/users/

創建一個新元素i將假設輸入值將發送作爲POST參數/ PHP中語法這被表示爲$_POST。但這不起作用。

經過一番測試,並閱讀了Rails風格的REST API(這是骨幹文檔建議的),我意識到所有請求變量都以相同的方式發送。如果我更改我的代碼以使用file_get_contents('php://input')來獲取每個請求類型的請求參數,則主幹網完美無缺。

這是REST API的標準公平嗎?或只是「軌道風味」的?

+1

我也想知道這一點。在我看來,對於請求或響應主體的格式,REST風格的API中沒有任何真正的標準,而且我所看到的關於構建REST API的許多內容基本上掩蓋了這個問題。我通常在請求和響應主體中使用純JSON編寫它們,而不是表單編碼。 – Troy

回答

1

PUT,POST,PATCH等(除了GET和DELETE *之外的所有東西)接受請求主體。一般數據作爲傳遞之一:

  • 被解碼和解析服務器將根據您的web框架$_POST(或類似的名稱/值對(完全一樣的URL查詢字符串)的URL編碼的字符串選擇)。 這通常依賴於存在Content-Type標頭設置爲application/x-www-form-urlencoded(瀏覽器在提交表單時默認執行此操作)。如果您看到file_get_contents('php://input')中的數據,但不是$_POST,則很可能此標頭不存在或設置爲其他值。如果您使用的是Chrome,則可以在開發工具的「網絡」選項卡中查看客戶端正在發送的標頭和正文。

  • 其他流行的請求主體格式是使用Content-Type: application/json然後寫出一個JSON字符串到主體。這可以通過file_get_contents('php://input')訪問,然後使用JSON解析器進行分析。

*關於DELETE的注意事項:it's a little unclear whether or not using a request body with DELETE is allowed or a good practice

+0

如果API調用是通過公共URL進行的,您也可以使用Runscope來檢查請求/響應/ shamless_plug –

+0

我喜歡檢查是否存在Content-Type標頭設置爲application/x-www-form-urlencoded的想法。然後讀取請求正文或php輸入。感謝名單! – xero

+0

該框架可能已經爲你做了。 –