为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确构建 REST-API 端点

如何正确构建 REST-API 端点

翻翻过去那场雪 2023-04-26 15:14:45
我对 REST-API 很陌生。我想要这样的东西POST http://localhost/posts/ <--- PostsController.javaGET http://localhost/posts/{id} <--- PostsController.javaPOST http://localhost/posts/{id}/comments <--- CommentsController.javaGET http://localhost/posts/{id}/comments <--- CommentsController.javaGET http://localhost/posts/{id}/comments/{id} <--- CommentsController.java以下控制器处理/posts和另一个控制器处理程序的位置/commentsPostsController.java@RestController@RequestMapping("/posts")public class PostsController {   // something}CommentsController.java@RestController@RequestMapping("/comments")public class CommentsController { //do something}我如何在有不同的控制器来处理它的同时维护上面的 url?
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

这是两个带有端点的控制器的框架,但是您仍然可以将所有这些端点放在一个控制器或不同的控制器中,有些人根据方法区分它们,有些人根据路径区分它们,所以我相信这完全是开发人员如何设计的经验这


PostsController.java


@RestController

@RequestMapping("/posts")

public class PostsController {


@PostMapping("/")

public String createPosts() {


    return "createPosts";


}


@GetMapping("/{id}")

public String getPosts(@PathVariable(name = "id") String id) {

    return "getPosts......" + id;

   }


}

CommentsController.java


@RestController

@RequestMapping("/posts/{id}/comments")

public class CommentsController {


@PostMapping

public String createComment(@PathVariable(name = "id") String id) {

    return "createComment..." + id;

}


@GetMapping

public String getComment(@PathVariable(name = "id") String id) {

    return "getComment..." + id;

}


@GetMapping("/{id1@Path}")

public String getCommentById(@PathVariable(name = "id") String id, @PathVariable(name = "id1") String id1) {

    return "getComment..." + id + "...." + id1;

     }


 }


查看完整回答
反对 回复 2023-04-26
?
狐的传说

TA贡献1804条经验 获得超3个赞

我会在这里分享我的经验。当我使用 Rest 控制器时,我总是试图理解什么是“核心”实体——我们处理的一个概念以及什么只是查询的标准。通常“核心”实体出现在上下文路径之后。

请注意,这并不真正取决于数据库级别的实际实现。

所以看起来所有的案例实际上都是关于“帖子”实体的,这就是为什么你把它放在第一位的原因(在帖子评论的情况下,你没有选择这样的东西,没关系,它http://localhost/comments?post=123只是意味着该帖子是您要服务的“主要”实体。

在这种情况下,我认为所有的操作都可以在PostsController.

现在是关于 Spring / SpringBoot 中控制器的重要旁注。人们倾向于将业务逻辑放在这些控制器中,我认为这是一个错误。控制器不应该包含任何真正的逻辑,也许是一些简单的输入转换/验证,但仅此而已。将真正的工作留给“服务”而不是控制器,让控制器成为后端的入口点。现在我为什么要这样说?因为控制器,如果以这种方式编写,实际上是小类,所以你不会得到一个处理所有问题的“巨型”类,我相信,这可能是分离不同控制器的一个理由。

好的,那么在这种情况下评论是什么?这取决于您如何看待它,但正如您在端点列表中所写,是帖子的属性(属于帖子/始终与帖子相关联的东西),因此它是“搜索标准”:给我一个有评论的帖子,只给我一个没有评论的帖子,给我一个只有今天和昨天的评论的帖子,关键是你总是查询“帖子”,而不是评论。

从纯技术的角度来看,@RequestMapping放在控制器类上的 spring boot 说只能/post被这个控制器查询。您还可以在注释上设置不同的值,@GetMapping/@PostMapping仅此而已。如果应该足够灵活来设计休息控制器的水平。


查看完整回答
反对 回复 2023-04-26
  • 2 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信