如何创建一个支持POST和GET的RESTful处理器?
我想要支持API:
GET /api/spam/{id}
POST /api/spam
body: {'name': 'green spam'}
我通常会通过以下方式路由到一个处理程序:
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的,一个是用来获取特定的spam,另一个是用来发布一个新的spam。我之所以不使用/spam/{id}来进行POST,是因为我正在创建一个新的spam,因此没有id。
1 个回答
2
通常情况下,你可以把它们做成不同的处理程序。正如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的情况下都是可以调用的。但实际上,你最好还是使用不同的处理程序。