2013-03-18 26 views
2

我正在幫助爲現有的數據庫開發新的API。用於POST和PUT的RESTful API和外鍵處理

我使用Python 2.7.3,Django的1.5和Django的REST的架構在PostgreSQL 9.1 2.2.4

我需要/想的API好的文檔,但是我缺兵少將,我恨編寫/維護文檔(我的許多缺陷之一)。

我需要允許API的消費者添加新的「POS」(銷售點)位置。在Postgres數據庫中,有一個從pos到pos_location_type的外鍵。所以,這是一個簡化的表結構。

pos_location_type(
    id serial, 
    description text not null 
); 

pos(
    id serial, 
    pos_name text not null, 
    pos_location_type_id int not null references pos_location_type(id) 
); 

所以,讓他們來發布新的POS機,他們將需要給我一個「pos_name」的一個有效pos_location_type。所以,我整個週末都在讀這些東西。那裏有很多爭論。

我的API消費者如何知道pos_location_type是什麼?或者在這裏傳遞什麼值?

看來我需要告訴他們在哪裏得到pos_locations的有效列表。喜歡的東西:

GET /pos_location/ 

作爲一個快速的注意,pos_location_type描述的例子可能是:( '學校', '公園', '辦公')。

我真的很喜歡Django REST框架的「可瀏覽性」,但它似乎沒有涉及這種類型的事情,而且我今天早些時候與湯姆克里斯蒂在IRC上聊了一個非常愉快的聊天記錄,他在這裏做什麼並沒有真正的答案(或者我從來沒有明確提出過我的問題)。

我看過Swagger,這是一個非常酷的/有趣的項目,但看看他們的「寵物」資源在他們的demo here。注意它與我需要做的非常相似。要添加新的寵物,您需要傳遞一個類別,它們將其定義爲類別類別(id:long,name:string)。消費者如何知道要通過什麼?什麼是有效的ID?或名字?

在Django rest框架中,我可以定義/覆蓋在OPTION調用中返回的內容。我想我可以拿出自己的小「系統」在這裏,回到像一些信息:

pos-location-url: '/pos_location/' 
在通用形式

,這將是:{}資源-url:「/路徑/要/ resource_list」

這樣的文件方面的工作,但我不知道這是否真的是一個很好的解決方案編程。如果我更改資源位置,該怎麼辦?這意味着我的消費者需要以編程方式使OPTION調用資源來找出所有關係。也許不是一件壞事,但感覺有點奇怪。

那麼,人們如何處理這種事情呢?

最後說明:我得到的事實,我真的不希望在這裏一個「泄漏」 abstaction,並有我的數據庫峯值直通API層,但事實仍然說是有這個一個foreign_key約束現有數據庫而任何沒有有效的pos_location_type_id的插入都會引發錯誤。

此外,我並不是試圖打開URI與ID辯論。對於這個的討論,用戶是否必須使用pos_location_type_id int值或URI並不重要。無論哪種情況,他們都不知道要發送給我什麼。

回答

0

我過去曾經使用過這種東西。我認爲有兩種方法可以解決這個問題,第一個是你已經說過的,允許API的用戶知道端點pos_location_type的id-like值。許多API都這樣做,因爲從您的API開發人員將不得不閱讀您的文檔,並會知道從哪裏獲得值pos_location_type。最終用戶不應該擔心這一點,因爲他們將有一個界面顯示可能的文本值的下拉列表。

另一方面,我也是這樣做的,而不是很REST風格。讓我們假設你在紐約的位置,並使用POST可能是這樣的:

POST /pos/new_york/ 

您可以處理/ POS /(LOCATION_NAME)/通過歸一文,然後只需在數據庫上搜索的值或一些相似之處,如果地方不存在,那麼你只是創建一個新的。在情況下,用戶可以添加新的地方,如果沒有,那麼用戶必須知道什麼固定的地方存在,這又是第一種情況,我們英寸

這樣就可以避免在請求數據pos_location_type,你可以以編程方式將其映射到有效的ID。

+0

感謝您的回覆。我不確定我瞭解你的建議。 API消費者如何知道他們需要發佈到/ pos/new_york/vs/pos/new-york/vs./pos/ny/vs/pos/nyc/ – 2013-03-18 18:37:10

+0

你是對的,我編輯了我的答案,但如果地點是固定的,那麼我認爲向用戶展示可能性是唯一的選擇。 – PepperoniPizza 2013-03-18 19:31:27

+0

感謝您的回覆和編輯。順便說一句,爲了清晰起見,我編輯了我的問題。它不像location_type(比如:學校,公園,零售店,辦公室)那麼位置(如城市)。 – 2013-03-18 20:22:12