這個問題涉及一個非常大的面積,我懷疑任何一個單一的答案可以涵蓋詳細事宜。我能做的是根據我所犯的錯誤提供一些起點。
建立在自己的API基礎上
不要將API功能添加到現有系統。這樣做會:
- 導致額外的測試負載(你必須來測試您的應用程序和獨立的API)
- 導致增加總體維護成本
- 導致質量較差API比您想要提供的要多
您的總體目標應該是先構建API,然後在自己的API之上構建應用程序。這樣做有以下好處:
- API的測試本質上是同時的應用測試
- 你會不會「忘記」添加任何所需的API方法
你的應用程式和執行應用程序邏輯(API)在邏輯上是分開的 - 在等式的每一方面以及它所負責的方面,它們之間將存在明確的分離。這將有助於指導發展。這也將使您可以非常輕鬆地將應用程序和API放在不同的機器上,並在需要時使用。
使用自己的API是一個很重要的一點。您的API的設計最初是次優的,只有通過自己使用它,您才能夠以高效的方式向人們提供實際所需的功能。
你會最終有一個系統,它大致是這樣的:
------------- -------------
| | | |
| Your APP | <= HTTP communication => | Your API |
| | | |
------------- -------------
這凸顯了一些進一步的好處:你可以與任何其他應用程序替換「你的APP」,讓你的客戶創造的應用程序,以用最適合他們的方式處理事情。您還可以在現有API之上創建新版本的應用程序 - 移至新版本的公共網站可能會更容易。
設計你的URL:映射類和方法
選擇明智的網址是太大的問題,只要選擇合理的類和方法名。從類及其方法派生URL是一種好方法。如果URL和類/方法之間沒有明顯的相關性,那麼從長遠來看,您會發現難以維護的事情。
我個人更喜歡的網址類和方法通過以下方式聯繫起來:
例子:
你的API的網址https://api.camerareadyart.com。
你有toColour()
和toBlackAndWhite()
方法的image
對象。
這可能映射到:
https://api.camerareadyart.com/image/toColour/
https://api.camerareadyart.com/image/toBlackAndWhite/
同樣的位圖矢量轉換:
https://api.camerareadyart.com/bitmap/toVector/
設計反應
當有人被從數據或信息的數據,一個你網址,會發生什麼?如何處理錯誤,如何處理例外?回答採取什麼形式?
我不能告訴你該做什麼。就我個人而言,我更喜歡將事物與HTTP緊密映射,然後在需要時才超越此範圍。
例如,如果進入的請求被接受並且被處理,但遇到錯誤內部我會發出500個狀態響應。同樣,如果給定的API方法需要未提供的身份驗證,則可能會發出403.利用現有的HTTP功能可以防止您重新創建某些內容。
使用HTTP
除了使用HTTP狀態代碼理智的現有的方面,一定要到處尋找一個僅HTTP滾動自己的解決方案之前,做一些方法。
希望用戶可以指定是否響應格式應通過XML或JSON?使用HTTP Accept頭。
想重新直接客戶,以不同的URL搶請求的結果?使用HTTP位置標題。
有許多功能,HTTP已經處理,你可能想要做很多事情。使用它們!
安全
一般有兩種問題在這裏解決:對用戶進行認證,並確定什麼樣的行動給定用戶可以執行。
安全性:身份驗證
用戶需要在他們的請求中指定他們是誰。
首先想到的解決方案是允許用戶指定用戶名和密碼,可能與用於訪問您的應用的用戶名和密碼相同。表面看來這是一個好主意,但它並不理想。
用戶最終將自己的用戶名和密碼烘焙到他們自己的應用程序中。不可避免地,一個用戶會忘記他們的密碼,並會改變它,以便他們可以愉快地訪問您的應用程序,在此過程中打破他們自己的應用程序。
用戶提供一個更好的選擇是提供一個認證令牌,它基本上是一個用戶唯一的唯一值,就像用戶名和密碼合併爲一個一樣。
這允許您在邏輯上將用戶名和密碼與訪問API分開。用戶可以隨時更改自己的應用的用戶名和/或密碼,而不會中斷他們對API的訪問。
用戶還可以擁有多個API令牌,每個令牌具有不同的訪問級別,允許用戶安全地將API令牌發送給第三方服務。
安全性:訪問控制
至於外界關注的是,你的API是一組URL。根據定義,每個URL都是唯一的,並執行一項獨特的任務。圍繞這些概念設置訪問控制機制是一個很好的起點。
我更願意保留令牌允許訪問的URL的每個令牌的列表。當使用給定的令牌訪問URL時,告知訪問哪個URL以及它是否位於令牌的允許的URL列表中是微不足道的。
如果您明智地選擇了一組URL,其中每個URL執行一個獨特的操作,此過程將爲您提供關於您將獲得的最佳級別的訪問控制。
爲了提供更精細的控制級別,您可能還需要指定每個允許訪問令牌的URL,允許使用哪些查詢參數。
感謝您的回覆。 這意味着我應該將API實現爲Web服務。因爲只有Web服務才能夠公開API,並且用戶只能通過它進行連接。 我是對的還是另一種方式? web serveice將如何提供。託管公司是否需要在服務器上進行任何更改? – 2009-08-10 04:32:07