Как представить модель Django как веб-сервис RESTful? - PullRequest
0 голосов
/ 20 июля 2009

Я пытаюсь создать веб-сервис REST, который предоставляет следующую модель Django:

class Person(models.Model):
    uid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=40)
    latitude = models.CharField(max_length=20)
    longitude = models.CharField(max_length=20)
    speed = models.CharField(max_length=10)
    date = models.DateTimeField(default=datetime.datetime.now)

    def __unicode__(self):
        return self.name

Вот как я до сих пор думал об этом:

Получить всех людей
URL: http://localhost/api/persons/
Метод: GET
Строка запроса:

  • startlat=
  • endlat=
  • startlng=
  • endlng=

Используется для получения лиц, находящихся в указанном координатном диапазоне.

  • page=

Используется для получения указанной страницы ответа (если ответ содержит несколько страниц).

Возвращает:

  • 200 OK & JSON
  • 404 Not Found

Пример:
Запрос:

GET http://localhost/api/persons/?startlat=10&endlat=15&startlng=30&endlng=60

Ответ:

{
  "persons":
  [
     { "href": "1" },
     { "href": "2" },
     { "href": "3" },
     ...
     { "href": "100" }
  ],
  "next": "http://localhost/api/persons/?startlat=10&endlat=15&startlng=30&endlng=60&page=2"
}


Получить информацию об указанном лице
URL: http://localhost/api/persons/[id]
Метод: GET
Возвращает:

  • 200 OK & JSON
  • 404 Not Found

Пример:
Запрос:

http://localhost/api/persons/5/

Ответ:

{
  "uid": "5",
  "name": "John Smith",
  "coordinates": {
                   "latitude":"14.43432",
                   "longitude":"56.4322"
                 },
  "speed": "12.6",
  "updated": "July 17, 2009, 8:46 a.m."
}



Насколько верна моя попытка? Любые предложения высоко ценятся.

Ответы [ 5 ]

3 голосов
/ 20 июля 2009
{ "href": "1" },

1 вряд ли является действительным URL. Вы должны использовать полные URL. Google для HATEOAS .

Также не забудьте отправить соответствующий заголовок Content-Type. Вы можете создать свой собственный тип mime для описания формата. Это дает вам возможность позже изменить тип содержимого (например, изменить формат после публикации). См. Управление версиями веб-служб REST

2 голосов
/ 20 июля 2009

Я думаю, что параметры запроса могут быть проще и понятнее. Это сделает URI более читабельным и обеспечит большую гибкость для будущих расширений:

GET http://localhost/api/persons/?latitude=10:15&longitude=30:60

Возможно, вы захотите включить их в будущем:

GET http://localhost/api/persons/?latitude=10&longitude=60&within=5km
1 голос
/ 20 июля 2009

Кажется, REST-круто. Даже я работал над такими же вещами, несколькими днями ранее.

Единственное изменение, которое я хотел бы сделать в нем, - это прямая ссылка на детали человека. А также некоторые детали (например, имя здесь), чтобы идентифицировать человека, и помочь мне в решении двигаться дальше. Как ...

{
  "persons":
  [
     { "name": "John Smith", "href": "http://localhost/api/persons/1/" },
     { "name": "Mark Henry", "href": "http://localhost/api/persons/2/" },
     { "name": "Bruce Wayne", "href": "http://localhost/api/persons/3/" },
     ...
     { "name": "Karl Lewis", "href": "http://localhost/api/persons/100/" }
  ],
  "next": "http://localhost/api/persons/?startlat=10&endlat=15&startlng=30&endlng=60&page=2"
}

Таким образом, я даю все, чтобы представить данные как,

  • <а href = "http://localhost/api/persons/1/" rel =" nofollow noreferrer "> Джон Smith
  • <а href = "http://localhost/api/persons/2/" rel =" nofollow noreferrer "> Отметить Генри
  • <а href = "http://localhost/api/persons/3/" rel =" nofollow noreferrer "> Брюс Wayne
  • ...
  • Карл Льюис

Следующая страница

0 голосов
/ 21 июля 2009

Возможно, вы захотите взглянуть на уже существующее промежуточное ПО REST. Я знаю, что они спасли меня много времени. Я использую http://code.google.com/p/django-rest-interface/. И фрагмент urls.py

json_achievement_resource = Collection(
    queryset = Achievement.objects.all(),
    permitted_methods = ('GET',),
    responder = JSONResponder(paginate_by = 10)
)

urlpatterns += patterns('',
    url(r'^api/ach(?:ievement)?/(.*?)/json$', json_achievement_resource),
)
0 голосов
/ 20 июля 2009

Можно указывать сокращенные URI в ваших ответах JSON, если вы предоставляете систему шаблонов. Например, дать базовый URI-код типа http://whatever.com/persons/{id}/, а затем указать идентификаторы. Затем с помощью Python вы можете просто выполнить форматирование строки. Вы никогда не хотите, чтобы программист действительно смотрел и понимал значение URI, что не обязательно при использовании шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...