2010-11-06 56 views
3

目前我正在嘗試構建一個寧靜的HTTP後端框架。僅使用四種HTTP方法創建任何類型的restful API?

我讀過一本書,叫做「平安web服務」,並啓動了一些腦力上的這個區域。

我現在爲什麼資源導向架構是一件好事,但仍有模糊的部分我不明白一個更大的圖片。我會試着解釋我的想法,看看有人能讓我更聰明。

難道不能說所有東西都是物體。汽車,鋼筆,書籍,甚至抽象的東西,如想法和概念都可能成爲一個對象。因爲單詞對象只是「某物」的人類發明。

難道你不能說每一個「東西」都是一種資源。硬幣,電腦甚至債務都可能是一種資源。但問題在於誰。債務是一種資源,但不是欠誰的人,而是欠他的人。與人類殘留物相同。他們是資源,但不是爲我們,而是爲了自然母親,因爲它需要平衡 - 進出 - 科學基礎(編程)。

資源(對象)似乎是名詞。如何形容詞和動詞?實際上似乎所有的東西都可以用名詞來描述。例如。

  • 形容詞:這款車是紅色的
  • 名詞:車內有一個紅色
  • 形容詞:我累了
  • 名詞:我有一個疲勞
  • 動詞:我殺了他
  • Noun:I create a kiss
  • 動詞:I kiss her
  • Noun:I create a kiss

這意味着resource = object = noun。來自不同角度的相同「東西」。

也許有動詞和不具有相當於名詞的形容詞,但隨後即只有在人類語言中的漏洞,而不是在概念本身。

那麼回到什麼開始了這一切。

當我真的想到只有4個(我知道還有一些)HTTP動詞 - POST,GET,PUT,DELETE - 我覺得它不能創建強大的restful API,因爲它們限制了API基本的CRUD操作。但是經過一些閱讀和思考之後,我意識到所有東西都只是可以創建,讀取,更改或刪除的資源。像內外一樣,簡單的規則,但是卻能夠創造任何東西。

但轉念一想,只存在「來」與「走出去」。也許只有「創建」和「刪除」。原因GET和PUT是可以用「創建讀取」和「創建更改」代替的動詞。

這一切只是我的母親自然的基本的想法玩。進出,創建和刪除。前者在編程領域已被廣泛接受。但後者你沒有聽到那麼多。但是,如果這是正確的,那麼這意味着HTTP Restful API可以用正確的方式創建任何東西,而不是通過修改版本(將動詞放在URI中,請求主體等)來創建任何東西,但僅使用POST, GET,PUT,DELETE。

我們只需將所有方法轉換爲資源/對象。相反的:

result = Books.search("Foo"); 

我們不得不思考:

result = Search.create(Books, "Foo"); 

你覺得這個怎麼樣? 考慮到這一點,是否可以使用四種HTTP方法創建任何種類的restful API? 是「創造」和「刪除」自然規律的另一部分嗎?

回答

1

我想你是關於一個restful API的兩個不同方面。將HTTP方法簡化爲IN和OUT已經通過請求和響應來完成。當然,您可以將讀取映射到GET和PUT來創建,但DELETE又如何?這是「PUT 0」嗎?如果是這樣,那麼你需要邏輯來處理這種情況。

例如,當您將文檔打開到文本編輯器中時,您將在操作系統中執行IN操作,並且操作系統對文本編輯器執行和執行操作。保存文檔的情況正好相反。

但是,這只是簡單的房屋維修機械師。當然,文本編輯器可以使用GET和OUT屏蔽IN,如「另存爲」,但DELETE如何?這將需要它自己的動詞或將PUT/OUT操作重載到操作系統。然後是POST,這相當於保存*。我們是否重載PUT方法來檢查文件是否已經存在?爲什麼不把它作爲自己的動詞?

如果你想減少對簡單IN和OUT,那麼你必須重載OUT:

if(OUT){ 
    if(file_exists) update_file 
    else if(file_size==0) delete_file 
    else create_file 
} 

*我來說更理論上,當然zzzzBov是他對HTTP的規範正確後。

+0

但也許這就是我想要的。進進出出。所以我們必須使用PUT或POST來表示「in」(aka request)和GET來表示「out」(aka響應)。在這種情況下,不應該有DELETE。爲了更普遍? – ajsie 2010-11-06 15:07:36

+0

如果你不想實現DELETE,那就是你的電話。如果你確實需要它,那又是另一種情況。但你仍然有創造與改變的情況。儘管它們被抽象爲一種「寫入」方法,但在實際寫入之前它們仍然遵循不同的代碼路徑。 – Jeremy 2010-11-06 15:30:26

0

GET,POST,PUT和DELETE不直接與創建,讀取,更新和刪除相關。他們通常可以,但重要的是要注意POST和PUT都可以執行更新和創建功能。

http://en.wikipedia.org/wiki/POST_%28HTTP%29

POST方法應被用於任何 上下文,其中請求是 非冪等

這意味着POST應該用於改變服務器的任何功能(數據)狀態,並且GET,PUT和DELETE應該用於任何不改變服務器狀態的功能。編輯:
回答這個問題:是的。我已經看到許多解決方案用於創建帶有html標頭的寧靜API。他們都歸結爲使用目錄結構和正確的HTML標頭。

http://en.wikipedia.org/wiki/Representational_State_Transfer#RESTful_web_services

+0

感謝您的澄清。但問題仍然存在。可以使用POST/PUT和DELETE來創建任何類型的restful API? – ajsie 2010-11-06 03:51:54

1

您可以使用只有兩種方法的任何系統,GET和POST,通過等同GET =讀取和POST =寫。 其他方法只是幫助添加一些可見性的請求。

如果你真的想嘗試和模型中的對象而言REST請求,我這樣做:

result = new Search(Books,"Foo").Get(); 

但是,我不知道這個映射是特別有價值的。

+0

是的,這聽起來更合乎邏輯:讀取/進入/ GET,寫入/結束/ POST。這是關於進出的。但是你是否同意每種方法都可以轉換爲一個對象?這意味着我只能使用GET和POST來創建任何穩定的API,因爲我的系統上的所有內容都是可以讀取或寫入的對象。 – ajsie 2010-11-06 03:58:48

+0

@weng:如果你重載POST,你的系統不再是真正的RESTful。 – 2010-11-06 07:05:42

+0

@Matthew這是公然錯誤的。這裏是羅伊關於該主題http://code.google.com/p/implementing-rest/wiki/FAQ – 2010-11-06 13:43:42

1

RESTful API本質上是某種數據存儲的接口:DB,文件系統,分佈式散列表,& c。這意味着你實際上不需要自定義動詞(標準接口通常更好),因爲你可以使用GET,PUT,POST和DELETE來完成所有的事情。

重要的是要注意,RESTful API 特別是要求使用現有HTTP方法來提取CRUD資源。而且,API不需要複雜或冗長,以便有用或者甚至是強大的。在大多數情況下,簡單是你的朋友。在許多情況下,簡單的結構和簡單的界面比等效的複雜結構/界面做得更好。看看git,例如,它使用的數據結構非常非常簡單,因此git非常非常快。

至於你的問題:是的,人們一直這樣做,它的工作原理!

+0

但git有自己的動詞(克隆,推,拉等)對嗎?無法僅使用http動詞執行混合操作(發佈,獲取,放置,刪除),還是一個壞主意? – ajsie 2010-11-06 15:12:21

+0

Git不是RESTful API,但HTTP動詞可用於創建具有類似功能的API。 – xj9 2010-11-06 15:26:28

1

但後來我想,只有「在」 和「出」。也許只有 「創建」和「刪除」。原因GET和 PUT是可以用「創建讀取」和「創建 更改」替換 的動詞。

你可以這樣做。你可以走得更遠,用POST完成所有的事情。然後,您可以在HTTP請求中包含一個信封,說明您要執行的操作。您甚至可以只有一個端點,並根據您的HTTP請求的內容進行多種不同的操作。你可以有createBook,updateBook,getAllBooks等等。

而你有SOAP。作爲需要構建,維護和編寫SOAP和RESTful Web服務的代碼的人,請自己(和其他人)傾心,並使用REST。

+1

您錯過了HTTP統一界面的要點。如果您使用HTTP方法,則其行爲必須符合RFC2616。然而,沒有要求說你必須使用所有的方法,並沒有說你是否要刪除某些東西,你必須使用delete。你應該,但不一定。 POST方法適用於任何可能不安全或冪等的操作。 POST不限於「將實體添加到集合」。它幾乎可以用於任何事情。 – 2010-11-06 13:52:53

+0

我並不是說你必須:我說使用HTTP動詞是有意義的。在存在可以遵循RESTful模式的資源的情況下,使用動詞來識別動作是有意義的。 (不要介意DELETE應該是idemopotent,但是如果資源已經被刪除......?)我的觀點是,使用POST進行任何操作都會破壞HTTP的透明性。 – 2010-11-07 00:35:00

+0

(呵呵,你應該對所有東西都使用POST這個想法有點諷刺,不知道是否在原來的帖子中出現過)。 – 2010-11-07 00:49:22

相關問題