代表RESTful API中的关系

时间:2011-11-01 20:50:20

标签: api google-app-engine restlet

我正在使用RESTlet为一组相关的资源设计RESTful API。

例如:

Person(/ people / 124)资源有一个属性“favoriteThing”,可能是Car,Food,Toy。

现在假设API的用户希望通过对/ person / 124 / favoriteThing URL执行POST来更新此属性。

但是,要处理此请求,我需要在数据存储区中记录此新关系(需要密钥(种类,ID))。

所以我有两个令人不安的选择:

1)期待POST正文中的URL(这似乎是RESETful) 但是如何从URL干净地转换为数据存储区密钥,需要(种类,ID)。

2)期待(种类,身份证)在POST的身体(非常容易) 但是这允许除URL之外的其他内容作为API中的资源标识符

这个问题最RESTful的解决方案是什么? 也许不是我考虑过的东西。

2 个答案:

答案 0 :(得分:2)

要扩展Moishe的响应,您实际上可以将路径的某些部分定义为变量(至少在Python中),而不是解析路径。

所以要处理'... / person / 124 / favorite':

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()

答案 1 :(得分:1)

(我将在这里假设Python,因为它更简洁)

使用'thing'本身作为POST参数发布到/ person / 124 / favoriteThing似乎对我来说是正确的。

所以现在你的问题是,如何干净利落地实施?那么,URI中的'124'是否在Person的键上方?您可以通过强制转换将Key()编码为字符串,例如

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

一个很好的技巧是你可以在WSGIApplication构造函数中使用正则表达式分组:

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

然后,当您收到PersonH​​andler的POST时,您可以拆分相关路径:

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