我正在使用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的解决方案是什么? 也许不是我考虑过的东西。
答案 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)
然后,当您收到PersonHandler的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