2012-07-12 76 views
0

我正在開發一個我希望成爲RESTful的Web服務。我知道CRUD的做事方式,但我有幾件事情沒有完全明確。所以情況如下:RESTful - GET或POST - 怎麼辦?

我有一個跟蹤服務,收集瀏覽器(客戶端)中的一些數據,然後將其發送到跟蹤服務器。有兩種情況,一種是配置文件存在,另一種則不存在。最後,服務返回一些必須注入DOM的元素。

所以基本上我需要2個Web服務:

  1. http://mydomain.tld/profiles/
  2. http://mydomain.tld/elements/

問題1: 現在我只是使用GET,但IM改寫服務器支持CRUD。所以在這種情況下,如果配置文件不存在,我必須使用POST。像http://mydomain.tld/profiles/之類的東西,然後POST負載有保存的信息。如果配置文件存在,我使用PUT和http://mydomain.tld/profiles/ /,並且PUT的有效載荷有數據要保存。所有的好,但問題是,據我瞭解,xmlhttp不支持PUT。即使使用POST更新,現在可以使用POST嗎?

問題2: 正如我說的,服務返回一些要注入到DOM中的元素,當創建一個軌道時。從邏輯上講,爲了保持RESTful,我想我將不得不使用POST/PUT來更新配置文件,然後GET來獲取要注入的元素。但爲了節省服務器端的帶寬和資源,使用POST/PUT將元素返回到配置文件更有意義,即使它是不同的資源。你對此有何看法?

BR /淑娜

編輯:

問題3: 在某些情況下,我只希望更新的姿態,並不會收到回元素。我是否仍然可以使用相同的資源,然後使用有效負載參數來指定我是否需要元素,例如「dont_receive_elements:true」

回答

0

問題#1,你確定xmlhttp不支持「put」嗎?我在三個瀏覽器(Chrome,Firefox,IE)上運行了http://www.mnot.net/javascript/xmlhttprequest/,根據輸出結果,「put」在所有瀏覽器上都成功了。關於http://www.slideshare.net/apigee/rest-design-webinar的信息(我強烈建議查看Apigee視頻和幻燈片放映API),建議在您提到的用例中使用「put」。

但是,您可能完全可以通過對您的數據稍加區分來避免此問題。是否有可能認爲您有一個配置文件,並且對於每個配置文件,您有0個或更多有效負載信息集?在這個模型中,兩種情況是: 1.沒有配置文件,在.../profiles /上創建配置文件,然後添加元素/跟蹤數據到.../profile/123/tracks /(或.. ./profile/123/elements/) 2.配置文件存在,只需添加元素/跟蹤數據

(對不起,沒有詳細瞭解您的模型,它很難做到非常精確)。

至於問題2--使用數據模型,其中一個配置文件有0個或更多元素,您可以更新配置文件(添加必要的元素),然後返回更新的配置文件(及其完整的元素圖),節省您任何額外的獲取。

更一般的問題#2,作爲API的開發者,你在REST世界擁有相當大的自由度 - 如果你專注於爲API的消費者提供簡單明瞭的服務, 。

底線:退房www.apigee.com - 他們知道很多比我更

+0

感謝您的回答。我會看看PUT部分。關於問題2 - 我的理解是,在REST世界中,每個資源都有其獨特的uri可供使用。在我的情況下,我想通過更新/創建一個資源並在同一個調用中將請求保存到服務器,實際上返回另一個資源。這可以接受嗎?我們返回的資源也可以通過它自己的URI進行操作。 – sunebrodersen 2012-07-13 07:40:05

+0

試圖從你的API開發人員的角度來看,發佈到資源A然後取回資源B會有些出乎意料。而任何意想不到的情況都需要清晰地記錄下來,並且會代表一點點的學習障礙並使用你的API。所以,如果你會採取這種方法來節省自己的時間,那麼我不會這樣做。如果這是一個可能的性能問題,那麼我會一直等到它成爲一個真正的性能問題,因爲您的API的成功實際上是基於其他人學習和使用它的能力。希望這有助於,RB – 2012-07-13 15:46:44

+0

請[不要添加簽名或標語到您的帖子](http://stackoverflow.com/faq#signatures)。 – meagar 2012-07-17 03:27:23

0

@Richard - 很多爲自己的鏈接和反饋表示感謝。我的解決方案是讓你的評論中提供的API簡單而乾淨,並且對每個資源都有獨立的調用。

然後爲了節省帶寬並保持性能,我在API中創建了一個「非官方」函數,它在內部像代理一樣工作,並用單個GET調用,更新配置文件並返回元素。這個,我知道,不是很安寧等,但它處理我的情況,不是官方API的一部分。我需要它來支持GET的原因是我需要從JavaScript調用它並跨域。

我想我可以通過使用JSONP解決了跨域,但我仍然要做出API「不潔」 :)