如何创建一个支持POST和GET的RESTful处理器?

2 投票
1 回答
1260 浏览
提问于 2025-04-16 16:42

我想要支持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的情况下都是可以调用的。但实际上,你最好还是使用不同的处理程序。

撰写回答