Как создать обработчик RESTful, который принимает как POST, так и GET? - PullRequest
2 голосов
/ 30 апреля 2011

Я хочу поддержку 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

Но сообщение терпит неудачу, потому что ожидает второй аргумент. Каков наилучший шаблон проектирования для размещения шаблонов URL-адресов RESTful для обработчиков для каждого типа ресурса?

UPDATE:

Следует отметить, что приведенные выше примеры uri представляют коллекцию (/ spam) и элемент (/ spam / {id}). Это не мое намерение. Оба примера URI относятся к элементу «спам»: один для получения конкретного спама, а другой - для размещения нового спама. Причина, по которой я не использую / spam / {id} для POST, заключается в том, что я создаю новый спам и поэтому не имею идентификатора.

1 Ответ

2 голосов
/ 30 апреля 2011

Обычно вы просто делаете их отдельными обработчиками: как указывает Себастьян, это разные ресурсы - сама коллекция, а не один элемент коллекции.

Если вы должны использовать один и тот же обработчик, вы можете указать аргумент по умолчанию:

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 будут вызываться без идентификатора, хотя - по всей вероятности, вам действительно следует использовать отдельные обработчики.

...