【问题标题】:How to create a RESTful Handler that accepts both POST and GET?如何创建一个同时接受 POST 和 GET 的 RESTful 处理程序?
【发布时间】:2011-08-15 22:18:45
【问题描述】:

我希望 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

但是帖子失败了,因为它需要第二个参数。将 RESTful url 模式适应每种资源类型的处理程序的最佳设计模式是什么?

更新:

需要指出的是,上面的 uri 示例表示一个集合 (/spam) 和一个元素 (/spam/{id})。那不是我的意图。两个 uri 示例都是针对元素 spam 的,一个是 GET 特定的垃圾邮件,另一个是 POST 新的垃圾邮件。我不使用 /spam/{id} 作为 POST 的原因是因为我正在创建一个新的垃圾邮件,因此没有 id。

【问题讨论】:

  • /api/spam/api/spam/{id} url 引用不同的资源:一个集合和集合中的一些项目;为什么他们应该使用相同的处理程序?

标签: python google-app-engine rest requesthandler


【解决方案1】:

通常,您只需将它们设为单独的处理程序:正如 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 的情况下调用,但很可能,您确实应该使用单独的处理程序。

【讨论】:

  • 我从未将它们视为不同的资源。无论我收到垃圾邮件、发布垃圾邮件还是更新垃圾邮件,垃圾邮件不是同一个资源吗?
  • 好的,我只是重读了维基百科条目,特别是这个例子:en.wikipedia.org/wiki/…。我理解为什么集合和元素是不同的资源,并且我打算上面的两个 uri 示例都表示一个元素,而不是垃圾邮件集合。所以我想我困惑的地方是 - 你如何将一个新元素发布到一个需要 key/id 的 uri?
  • @Arch Stanton:如果您知道资源的 url,那么您可以使用 PUT 方法来创建/替换资源。
  • 哦,等等,它刚刚击中了我。我向集合资源发布一个新元素,然后从元素资源中获取/放置/删除一个现有元素。所以是的,它们是两种不同的资源。
猜你喜欢
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2014-07-09
  • 2017-06-20
  • 2018-11-13
  • 2015-08-15
  • 2015-06-13
相关资源
最近更新 更多