Представление отношений в RESTful API - PullRequest
0 голосов
/ 02 ноября 2011

Я разрабатываю RESTful API, используя RESTlet, для набора связанных ресурсов.

Например:

Ресурс Person (/ people / 124) имеет свойство "favourite", которое может быть Car, Food, Toy.

Теперь давайте скажем пользователюAPI хотел бы обновить это свойство, выполнив POST для / person / 124 / favourite URL.

Однако для обработки этого запроса мне нужно записать это новое отношение в хранилище данных (требуется ключ (Kind), Id)).

Итак, у меня есть два варианта беспокойства:

1) Ожидать URL в теле сообщения POST (это выглядит как RESETful) Но как я могу аккуратно перевести URL-адрес в хранилище данных?Ключ, требует (Kind, ID).

2) Ожидайте (Kind, ID) в теле POST (очень просто) Но это позволяет чему-то, кроме URL, служить идентификатором ресурса в API

Какое RESTful решение этой проблемы?Может быть, что-то другое, чем я рассмотрел.

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

Чтобы расширить ответ Мойши, вы можете определить части пути как переменные (по крайней мере, в Python), а не анализировать путь.

Чтобы обработать '... / person / 124 / favourite':

class PersonHandler(webapp.RequestHandler):
    def get(self, person_key, favorite):        
        person = Person.get(db.get(person_key))
        person.Favorite = favorite
        person.put()

application = webapp.WSGIApplication([('/person/([^/]+)/([^/]+)', PersonHandler)],
                                                                         debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()
1 голос
/ 02 ноября 2011

(я предполагаю, что Python здесь, потому что он более лаконичен)

POST to / person / 124 / favourite С самой «вещью» в качестве параметра POST мне кажется правильным.

Итак, теперь ваш вопрос, как это реализовать чисто? Ну, а «124» в URI над ключом Человека? Вы можете закодировать Key () в строку, просто приведя ее, например.

uri = '/person/%s' % str(person.key())

Хорошая уловка в том, что вы можете использовать регулярное выражение в конструкторе WSGIApplication:

def main():
  application = WSGIApplication(['/people/(.*)', PersonHandler], debug=True)

Затем, когда вы получите POST для вашего PersonHandler, вы можете разделить соответствующий путь:

class PersonHandler(RequestHandler):
  def post(self, path):
    (key, property) = path.split('/')
    person = Person().get(Key(key))
    # check that property is valid, get POST param and change it
...