2011-11-01 66 views
0

我正在使用RESTlet爲一組相關資源設計RESTful API。在RESTful API中表示關係

例如:

人(/人/ 124)資源有一個屬性 「favoriteThing」,可能是汽車,食品,玩具。

現在讓我們說一個API的用戶想要通過執行POST到/ person/124/favoriteThing URL來更新這個屬性。

但是,爲了處理這個請求,我需要在Datastore中記錄這個新的關係(需要一個Key(Kind,Id))。

所以我有兩個令人不安的選擇:

1)預計在POST的主體中的URL(這似乎RESETful) 但我怎麼能幹淨地從網址到數據存儲的關鍵翻譯,需要(種類,ID) 。

2)預期(種類,ID)在POST(很容易) 的身體,但這種允許不是URL以外的東西,作爲一個資源標識符的API

什麼是最RESTful的解決辦法這個問題? 也許不是我所考慮的。

回答

1

(我將在這裏假設Python的,因爲它更簡潔)

POST到/人/ 124/favoriteThing與「東西」本身作爲一個POST參數似乎是正確的我。

所以,現在你的問題是,如何實施乾淨?那麼,人的關鍵之上的URI中的'124'是什麼?你可以將一個Key()編碼成一個字符串,例如,

uri = '/person/%s' % str(person.key()) 

一個不錯的技巧是,你可以使用正則表達式分組在WSGIApplication會構造:

def main(): 
    application = WSGIApplication(['/people/(.*)', PersonHandler], debug=True) 

然後,當你得到一個POST到您的PersonH​​andler,可以拆分相關的路徑:

class PersonHandler(RequestHandler): 
    def post(self, path): 
    (key, property) = path.split('/') 
    person = Person().get(Key(key)) 
    # check that property is valid, get POST param and change it 
+0

我使用的Java與Restlet框架。但關鍵的想法是一樣的。所以聽起來像正確的解決方案是提出某種URI->鍵映射機制,並且絕不暴露API以外的字段的ID。 –

2

要擴展Moishe的響應,實際上可以將部分路徑定義爲變量(至少在Python中),而不是解析路徑。

所以處理 '... /人/ 124 /最愛':

class PersonHandler(webapp.RequestHandler): 
    def get(self, person_key, favorite):   
     person = Person.get(db.get(person_key)) 
     person.Favorite = favorite 
     person.put() 

application = webapp.WSGIApplication([('/person/([^/]+)/([^/]+)', PersonHandler)], 
                     debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main()