我正在设计一种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
答案 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}
希望它可以解决您的问题。