为REST API设计URI的最佳方法

时间:2018-06-27 11:27:27

标签: rest api uri url-design

我正在设计一种REST API,其功能与Facebook中的帖子和评论类似。

URI看起来像:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=12345, result=0, data=null} to activity {in.inspiringwave.firstapp/in.inspiringwave.firstapp.UploadDocsActivity}: 
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter data at
android.app.ActivityThread.deliverResults(ActivityThread.java:4173) at
android.app.ActivityThread.handleSendResult(ActivityThread.java:4216) at
android.app.ActivityThread.-wrap20(ActivityThread.java)

要获取所有注释,我使用集合URI命名标准。例如:

/posts/{post-id}/comments/{comment-id}

但是,当我需要对所有帖子发表评论时,我遇到了困难。请记住,我只想对帖子和评论使用此设计,这是最好的整合方式?

编辑

在这里我不得不提到,我正在使用的资源与帖子和评论有些不同,在我的设计中,我将不得不使用帖子,而评论不能作为完全不同的实体。抱歉造成误会。

说,建议以下列任何一种方式设计URI:

/posts/{post-id}/comments

2 个答案:

答案 0 :(得分:0)

  

但是当我需要对所有帖子发表评论时,我遇到了困难。请记住,我只想在帖子和评论中使用这种设计,这是结合这种方式的最佳方法。

HTTP包含redirection的概念-一种通用的工具,用于告诉客户端将请求发送到其他资源。

GET /714eeebd-d89e-4f13-b2a8-cf8a3ee03481 ...

307 Temporary Redirect
Location: /7604abf9-d4f5-42c7-b687-96dbff32649f

含义是什么,如果您为URI选择了错误的拼写,则可以在以后更正它。

REST的设计使得标识符是不透明的-除了服务器之外,没有人应该从中提取信息。

此外,请记住,资源不是域实体-与域对象相比,拥有更多的资源是正常的。域模型中的任何给定帖子可能都有许多不同的资源来显示它。

如果您确实在开发REST服务,并且想通过使其难以作弊来“帮助”客户,则可能要放弃使用hackable identifier的想法。

所有这些

/comments

完全是一个完全合理的集合标识符,并且在该根下创建标识符层次结构也是完全合理的。

答案 1 :(得分:0)

下面的URI应该可以达到目的。

  

/评论

对于上面给出的示例,让我们了解实体与URI的关系:

帖子评论是两个单独的实体。

当您只需要发布并且仅传递post_id时

  

要检索帖子:

/posts
     

要检索特定帖子:

/posts/{post_id}

当您只需要注释并且仅传递comment_id时

  

要检索所有评论:

/comments
     

要检索特定评论:

/comments/{comment_id}

当您需要通过传递post_id和comment_id来对给定帖子发表评论

  

要检索帖子评论,请执行以下操作:

/posts/{post_id}/comments
     

要检索给定帖子的特定评论:

/posts/{post_id}/comments/{comment_id}

希望它可以解决您的问题。