2011-11-01 69 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()