如何正确构建 REST-API 端点
How to properly structure REST-API endpoints
我对 REST-API 很陌生。
我想要这样的东西
POST http://localhost/posts/ <--- PostsController.java
GET http://localhost/posts/{id} <--- PostsController.java
POST http://localhost/posts/{id}/comments <--- CommentsController.java
GET http://localhost/posts/{id}/comments <--- CommentsController.java
GET http://localhost/posts/{id}/comments/{id} <--- CommentsController.java
其中以下控制器处理 /posts
和另一个控制器处理程序 /comments
PostsController.java
@RestController
@RequestMapping("/posts")
public class PostsController {
// something
}
CommentsController.java
@RestController
@RequestMapping("/comments")
public class CommentsController {
//do something
}
我如何维护上述 url 同时使用不同的控制器来处理它?
我会在这里分享我的经验。
当我使用 Rest 控制器时,我总是试图理解什么是 "core" 实体——我们处理的一个概念以及什么只是查询的标准。通常 "core" 实体出现在上下文路径之后。
请注意,这并不真正取决于数据库级别的实际实现。
所以看起来所有案例实际上都是关于 "post" 实体的,这就是为什么你把它放在第一位的原因(对于 post 的评论,你没有选择这样的 http://localhost/comments?post=123
没关系,这只是意味着 post 是您要服务的 "main" 实体。
在这种情况下我认为所有操作都可以在PostsController
中完成。
现在是关于 Spring / SpringBoot 中控制器的重要旁注。
人们倾向于将业务逻辑放在这些控制器中,我认为这是一个错误。控制器不应该包含任何真正的逻辑,也许是一些简单的输入转换/验证,但仅此而已。将真正的工作留给 "Services" 而不是控制器,让控制器成为后端的入口点。现在我为什么要这样说?因为控制器,如果以这种方式编写,确实很小 classes,所以你不会得到一个 "giant" class 来处理所有的控制器,我相信,这可能是一个论据分离到不同的控制器。
好的,那么在这种情况下评论是什么?这取决于你如何看待它,但正如你在端点列表中所写的那样,是 post 的 属性(属于 post/ 的东西总是与 post), 所以它是一个 "Criteria of search": 给我一个有评论的 post, 给我一个没有评论的 post, 给我一个只有评论的 post 来自今天和昨天,关键是你总是查询"post",而不是评论
从纯技术的角度来看,spring boot when put on controller class 中的 @RequestMapping
表示只有 /post
可以被这个控制器查询。
您还可以在 @GetMapping/@PostMapping
注释上设置不同的值,但那是
它。是否应该足够灵活来设计rest controller的水平。
这是带有端点的两个控制器的框架,但是您仍然可以将所有这些端点放在一个或不同的控制器中,有些人根据方法区分它们,有些人根据路径区分它们,所以我相信这完全是开发者体验如何设计这个
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;
}
}
我对 REST-API 很陌生。
我想要这样的东西
POST http://localhost/posts/ <--- PostsController.java
GET http://localhost/posts/{id} <--- PostsController.java
POST http://localhost/posts/{id}/comments <--- CommentsController.java
GET http://localhost/posts/{id}/comments <--- CommentsController.java
GET http://localhost/posts/{id}/comments/{id} <--- CommentsController.java
其中以下控制器处理 /posts
和另一个控制器处理程序 /comments
PostsController.java
@RestController
@RequestMapping("/posts")
public class PostsController {
// something
}
CommentsController.java
@RestController
@RequestMapping("/comments")
public class CommentsController {
//do something
}
我如何维护上述 url 同时使用不同的控制器来处理它?
我会在这里分享我的经验。 当我使用 Rest 控制器时,我总是试图理解什么是 "core" 实体——我们处理的一个概念以及什么只是查询的标准。通常 "core" 实体出现在上下文路径之后。
请注意,这并不真正取决于数据库级别的实际实现。
所以看起来所有案例实际上都是关于 "post" 实体的,这就是为什么你把它放在第一位的原因(对于 post 的评论,你没有选择这样的 http://localhost/comments?post=123
没关系,这只是意味着 post 是您要服务的 "main" 实体。
在这种情况下我认为所有操作都可以在PostsController
中完成。
现在是关于 Spring / SpringBoot 中控制器的重要旁注。 人们倾向于将业务逻辑放在这些控制器中,我认为这是一个错误。控制器不应该包含任何真正的逻辑,也许是一些简单的输入转换/验证,但仅此而已。将真正的工作留给 "Services" 而不是控制器,让控制器成为后端的入口点。现在我为什么要这样说?因为控制器,如果以这种方式编写,确实很小 classes,所以你不会得到一个 "giant" class 来处理所有的控制器,我相信,这可能是一个论据分离到不同的控制器。
好的,那么在这种情况下评论是什么?这取决于你如何看待它,但正如你在端点列表中所写的那样,是 post 的 属性(属于 post/ 的东西总是与 post), 所以它是一个 "Criteria of search": 给我一个有评论的 post, 给我一个没有评论的 post, 给我一个只有评论的 post 来自今天和昨天,关键是你总是查询"post",而不是评论
从纯技术的角度来看,spring boot when put on controller class 中的 @RequestMapping
表示只有 /post
可以被这个控制器查询。
您还可以在 @GetMapping/@PostMapping
注释上设置不同的值,但那是
它。是否应该足够灵活来设计rest controller的水平。
这是带有端点的两个控制器的框架,但是您仍然可以将所有这些端点放在一个或不同的控制器中,有些人根据方法区分它们,有些人根据路径区分它们,所以我相信这完全是开发者体验如何设计这个
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;
}
}