我正在尝试创建一个暴露以下Django模型的REST Web服务:
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
到目前为止,这是我对此的看法:
获取所有人
网址: 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"
}
获取指定人员的信息
网址: 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."
}
到目前为止我的尝试有多正确?任何建议都非常感谢。
答案 0 :(得分:3)
{ "href": "1" },
1
几乎不是有效的网址。您应该使用完整的URL。 Google为HATEOAS。
另外,请记住发送相关的Content-Type
标头。您可能想要编写自己的mime类型来描述格式。这使您可以选择稍后更改内容类型(例如,在发布后更改格式)。见Versioning REST Web Services
答案 1 :(得分:2)
我认为查询参数可以更简单,更清晰。这将使URI更具可读性,并为将来的扩展提供更大的灵活性:
GET http://localhost/api/persons/?latitude=10:15&longitude=30:60
您可能希望将来启用这些功能:
GET http://localhost/api/persons/?latitude=10&longitude=60&within=5km
答案 2 :(得分:1)
似乎很酷。几天前,我甚至在同类事情上工作过。
唯一的变化,我很乐意在其中做,是与人员细节的直接联系。还有一些细节(比如 name )来识别这个人,并帮助我决定进一步导航。像...
{
"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"
}
通过这种方式,我提供所有内容,将数据显示为
答案 3 :(得分:0)
如果您提供一些模板系统,可以在JSON响应中提供速记URI。比如提供http://whatever.com/persons/ {id} /之类的基本URI,然后提供ID。然后使用python,您可以对字符串执行格式调用。您不希望让程序员真正查看并理解URI的含义,这在使用模板时是不必要的。
答案 4 :(得分:0)
您可能希望了解预先存在的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),
)