2016-09-15 72 views
0

我開始學習REST(用於我自己的項目),並同時嘗試使用Philips Hue API。我發現了一個奇怪的IMO效應:打開燈,我需要PUT{"on": true}/api/<KEY>/lights/6/state。燈狀態可以通過GET/api/<KEY>/lights/6/上檢索到,並且我接收例如PUT的REST端點應該是GETable嗎?

{ 
    "state": { 
     "on": true, 
     "bri": 113, 
     "alert": "none", 
     "reachable": true 
    }, 
    "type": "Dimmable light", 
    "name": "Light 6", 
    "modelid": "LWB006", 
    "manufacturername": "Philips", 
    "uniqueid": "00:17:89:01:11:57:da:8d-0b", 
    "swversion": "5.38.1.15095" 
} 

但是我無法從/api/<KEY>/lights/6/stateGET什麼:

[ 
    { 
     "error": { 
      "type": 3, 
      "address": "/lights/6/state", 
      "description": "resource, /lights/6/state, not available" 
     } 
    } 
] 

我不知道我其實看它的任何地方,但感覺我從閱讀REST許多不同的文本有告訴我,如果我可以PUT/api/endpoint,我應該也可以GET回來。因此,如果我設計了API,它可能是PUT{"state": {"on": true}}/lights/6GET/lights/6/state將返回{"on": true}

對此有什麼普遍的一致意見嗎?

UPDATE:正如所提到的,我沒有真正引用任何東西。試圖找到現在的參考,我設法找到a popular tutorial,這似乎開始對我錯了:

PUT-用於創建一個新的資源。
POST - 用於更新現有資源或創建新資源。

我相信所有其他資源,例如thisthis,明確表示POST不應該用於更新。

但是一般來說,REST基於標識「資源」的URL。因此,如果我可以將數據放入資源,我也應該能夠從該資源獲取數據。我無法在任何地方發現它,但是資源的概念是否意味着它呢?

+0

是的,你錯了。我建議通過REST的基礎知識。如果GET在服務端聲明爲GET,並且與其他方法(PUT,POST,DELETE)相同,則GET只會給出結果。沒有協議,因此使用相同的URI可以執行GET和PUT .. – Rohit

+1

@Rohit,你真的很快:)你可以將你的評論轉換爲答案嗎? – texnic

回答

0

我在工作中對此進行了討論。根據我的經驗,在Get/Post/Delete /等的早期階段,只有GET和POST被使用; POST用於以大量發送數據或從URL中「隱藏」數據。其他HTTP方法基本實現爲使用GET/POST作爲「載體」的子協議。這是可能的,因爲REST服務一旦收到請求就可以做任何事情。隨着網絡服務越來越規範,各種HTTP方法開始得到適當的使用。

您對飛利浦API的使用經驗很有意義 - 要改變某些事情,使用PUT方法獲取狀態,請使用GET。我沒有解釋爲什麼GET在嘗試獲取狀態時失敗。

您引用的文本(沒有引用)似乎意味着如果您設置(PUT)某個值的值,您應該能夠讀取(GET)某個值的值。而且使用類似的URL會很有意義。但歸結起來,它是如何實施的;除了向下投票之外,還有很多事情可以阻止你編寫一個從數據庫中刪除DELETE的GET接口(不這樣做)。

當您編寫REST API時,我強烈建議您遵循當前的最佳實踐,使用定義的HTTP方法和適合您的應用程序。它會使API直觀,並且後端代碼將模塊化且易於維護。

1

我想我對Phillips Hue方式感到厭惡。我的理解一直是,你在地點使用資源。 POST應該創建一個指定類型的新資源,PUT應該更新它指向的資源(或者在給定位置創建一個,如果它不存在)等。

我覺得這可能更傳統一些是POST .../lights/:id/states,它爲給定的光創建了一個新的state資源,可能描述其當前狀態。這也意味着(通常)意義上的優勢,即設備的狀態歷史。 (例如,GET .../lights/6/states/3也會存在)

PUT方法要求封閉的實體存儲在提供的Request-URI下。如果Request-URI指向一個已經存在的資源,那麼封閉的實體應該被認爲是駐留在原始服務器上的修改版本。 https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

如果狀態僅僅是光的屬性,而不是像它自己的資源,我期望是行爲像你描述的處理:PUT .../lights/6在體內的狀態信息。

+0

嗨戴夫,我不知道我是否同意你的願景(是陳述一個新的資源或現有的一個屬性?),但最後一句話是明確的:)然而,我的問題是關於不能得到我可以放的東西。 – texnic

相關問題