API RESTful资源命名

时间:2018-01-08 20:21:30

标签: django rest api django-rest-framework

当我需要为REST API创建资源URL时,我总是怀疑你能看到以下内容。我想知道是否有人可以帮助我。

我们假设我有两个模型。

  • 用户

用户可以提交自己的帖子,并可以评论自己和其他帖子。

用户的主要资源网址为:

GET  /users                     # Retrieve all users.
POST /users                     # Create a new user.
GET/DELETE/PUT /users/{user_id} # Get, remove and update an user.

Post的主要资源网址为:

GET  /posts                     # Retrieve all posts.
POST /posts                     # Create a new post.
GET/DELETE/PUT /posts/{post_id} # Get, remove and update a post.

我的问题出现在例如我想要的时候:

前10名提交者(过滤参数(外部链接,讨论,全部))。网址应为:

GET /users/top?type=ext
GET /users/top?type=disc
GET /users/top # for all

或许应该是:

GET /users?top=ext
GET /users?top=disc
GET /users?top=all

同样但有帖子:

评论10篇评论(过滤参数(外部链接,讨论,全部))。网址应为:

GET /posts/comments?type=ext
GET /posts/comments?type=disc
GET /posts/comments # for all

或许应该是:

GET /posts?top=ext
GET /posts?top=disc
GET /posts?top=all

上述任何选项对您有好处,或者应该是另一种方式?

此致

2 个答案:

答案 0 :(得分:1)

我喜欢将REST URI视为模型表示。

所以/users/top没有多大意义,但/posts/comments似乎很好(因为评论也可能是一个不同的模型)。但对于您的情况,我推荐其他一组查询参数,因为它们被广泛用于过滤和放大。排序请求。所以在你的情况下,我建议像:

GET /users?sort=ext&order=desc&limit=10

这有助于我理解我要求userext顺序排序descending的10 type=ext个资源。 (如果需要,您甚至可以将其更改为npm ERR! code EAI_AGAIN npm ERR! errno EAI_AGAIN npm ERR! request to http://registry.npmjs.org/-/user/org.couchdb.user:belzee10 failed, reason: getaddrinfo EAI_AGAIN registry.npmjs.org:80 npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\belzee\AppData\Roaming\npm-cache\_logs\2018-01-08T16_03_35_050Z-debug.log

答案 1 :(得分:1)

像往常一样; REST并不关心你使用什么拼写。

你可能寻找灵感的地方是......堆栈溢出本身。这些URI看起来很熟悉吗?

/questions?sort=newest
/questions?sort=featured
/questions?sort=votes

API有pretty decent documentation,它还会提供适当的拼写提示来处理分页和搜索范围。

也就是说,IMDB采用了不同的方法 - The Shawshank Redemption使用了直接的"我是一个集合的元素"拼写

http://www.imdb.com/title/tt0111161/

但有史以来top rated titles?它们显示为图表

http://www.imdb.com/chart/top
  

但我想知道根据@Hawkes答案是否有标准,或者根本没有标准。

完全没有标准;只是本地拼写惯例。在某种程度上,这是REST的一部分:服务器可以使用任何拼写的URI有意义,而客户端只是跟随它的鼻子"基于对媒体类型的处理规则和服务器提供的数据的理解。