2012-07-17 33 views
1

restful api必須使用get,post,put或delete請求方法。提交的行爲和數據完全由uri字符串決定。沒有查詢參數或變量。restful api只使用乾淨的URL - 沒有url變量或post變量

這是真的嗎?

有效期:http://example.com/foo/84

有效:http://example.com/foo/?value=84

有效期:

$.ajax({ 
  type: 'POST', 
  url: "http://example.com/foo/84", 
  success: success, 
  dataType: dataType 
}); 

有效:

$.ajax({ 
    type: 'POST', 
    url: "http://example.com/foo/", 
    data: 84, 
    success: success, 
    dataType: dataType 
}); 

編輯 目前爲止有兩個答案,而且相互矛盾。

回答

-3

http://example.com/foo/?value=84是無效的並非完全正確。我的意思是,只要它是一個有效的URL,它就可以工作,並且你可以通過get或post獲取參數。另一方面,REST是一種體系結構,它的一個要求是一個乾淨的URL(不包括具有'?'的參數),所以這樣的URL不被認爲是像URL那樣的REST。

所以,如果你打算建立一個基於REST的應用程序,你應該只使用乾淨的URL。

編輯:

我從註釋中看到下面有一個問題了解什麼是REST,所以我會盡力舉一個簡單的例子:

  1. 爲了得到數據你會可能使用http://example.com/foo/84作爲獲取請求,其餘FW知道獲取id爲84的資源foo。
  2. 爲了發佈關於foo的數據,您可以將http://example.com/foo/84作爲POST請求,現在其他FW知道自從它發佈請求會調用負責處理郵件的方法而不是處理郵件的方法獲取
  3. 要刪除,請使用DELETE操作調用相同的URL,我想其他人都知道。

所以,儘管你有相同的URL,它真的很重要,如果它的GET/POST/PUT/DELETE請求。

+0

啊兩個對立的答案... – NimChimpsky 2012-07-17 13:07:29

+0

我不認爲我們的答案不同意,儘管他們的表述不同。要將Web API視爲RESTful,需要遵循特定模式。 '/ foo /?value = 84'會起作用,這是真的,但它不會是一個REST API。如果您以這種方式訪問​​資源,您將錯過REST API的某些優勢,尤其是緩存。 – 2012-07-17 13:32:06

+0

@Laurent yr回答中的第二個示例在url中使用查詢參數。它不乾淨,但你說它是寧靜的。鑑於這個答案說寧靜不能在get請求中使用url參數。 – NimChimpsky 2012-07-17 13:50:40

3

POST變量絕對沒問題否則你將如何提交新資源或更新它?

GET參數可以很好地指定如何呈現資源。所以確實http://example.com/foo/?value=84是不正確的 - 該URL不代表資源。

但是,http://example.com/user/84?fields=first_name,last_name會沒事的。在這種情況下,您可以使用其他查詢參數來指定您只需要該資源的名和姓。

+0

帖子變量:通過指定url中的數據,我認爲這有點說實話。 – NimChimpsky 2012-07-17 12:59:31

+0

@NimChimpsky想想數據和表達之間的區別。例如,用戶列表可以通過/用戶訪問,但也可以按姓氏/用戶排序?sort = lastname。它仍然是相同的數據,只是略有不同。 – 2012-07-17 13:03:03

+0

@ZetaTwo到底是具體定義的呢?這是使用http請求訪問和檢索數據的另一個名稱,據我所知。它建議使用刪除和放置刪除和插入數據的慣例?另一個答案與這個btw相矛盾。 – NimChimpsky 2012-07-17 13:05:02

5

這裏有第三個答案與另外兩個相矛盾。

RESTful URI幾乎是一個矛盾。 URI的語義與REST無關,唯一對REST至關重要的是一個URI只能標識一個資源。除此之外,URI是一個原子標識符,其語義無關緊要。

休息如果URI指向喬Doe的用戶資源也沒關係是:

http://example.com/users/joedoe 

或者:

http://example.com/users?username=joedoe 

或者:

http://example.com/jif892mfd02-18f2 

或者甚至:

ftp://example.com/users/joedoe.json 

沒關係! URI在RESTful應用程序中不需要有任何意義。人們花了很多時間爲他們的REST應用程序設計有意義的URI,而他們應該關心他們的媒體類型。當你點擊網頁上的鏈接時,你不關心URI的語義,你只關心標籤。使用REST API的客戶端也會發生同樣的情況。您的媒體類型的文檔應該通過標籤描述哪些鏈接可用以及他們做了什麼,並且您只需遵循它們。

如果您關心的是URI的語義,這表示您的客戶正在從文檔中的某個模板構建URI,並且您沒有使用HATEOAS,這意味着您根本沒有使用REST 。

+0

但是,當你是一個開發人員必須與該API集成並使用它時,它確實會幫助你設計一個設計良好並遵循現有約定的開發人員。此外,有些人有時必須手動輸入網址,因此有一個易於閱讀的網址可以提高讀取或轉換率。那些沒有?和=對於人類來說更容易,至少對於那些超級天才來說,並不是超級天才。 :D – jmort253 2013-11-02 19:03:31

+0

沒有。如果您是與RESTful API集成的開發人員,那麼您將遵循隨資源提供的URI。如果你做得對,你可能永遠不需要直接處理URI而不是將它存儲在變量中,然後使用變量。如果該服務要求您從文檔中給出的模板構建URI,那麼它不是RESTful,就像那樣簡單。 – 2013-11-02 19:11:20

+0

當然,這並不意味着你不應該對你的URI進行一些思考。它只是意味着遵循約定X或Y的URI不會使您的API或多或少具有REST風格。什麼讓您的API RESTful是您向客戶提供URI的方式。 – 2013-11-02 19:13:02