我希望API支持:
GET /api/spam/{id}
POST /api/spam
body: {'name': 'green spam'}
我通常会路由到Handler:
webapp.WSGIApplication([r'/api/spam/(.*)', APISpam])
class APISpam(RequestHandler):
def get(self, id):
# do stuff
def post(self):
# do stuff
但是post失败了,因为它期待第二个参数。为每种类型的资源的处理程序提供RESTful url模式的最佳设计模式是什么?
更新:
上面的uri示例表示一个集合(/spam)和一个元素(/spam/{id})。那不是我的本意。两个uri示例都针对元素spam,一个是GET特定的垃圾邮件,另一个是POST新的垃圾邮件。我没有使用/spam/{id}作为POST的原因是因为我正在创建一个新的垃圾邮件,因此没有id。
通常情况下,您只需将它们设置为单独的处理程序:正如Sebastian指出的那样,它们是不同的资源—集合本身与集合中的一个元素。
如果必须使用相同的处理程序,则可以提供一个默认实参:
class APISpam(RequestHandler):
def get(self, id=None):
# do stuff
def post(self, id=None):
# do stuff
application = webapp.WSGIApplication([r'/api/spam(?:/(.*))?'])
get和post处理程序都可以在没有ID的情况下调用,但是-很可能,您确实应该使用单独的处理程序。