gpt4 book ai didi

java - Spring REST 重用嵌套请求映射

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:05:37 27 4
gpt4 key购买 nike

我们有一个 REST API,用于一些评论。目前,最有趣的 URI 是:

GET /products/1/comments             // get all comments of product 1
GET /products/1/comments/5 // get the 5th comment of product 1
GET /products/1/comments/5/user // get the user of the 5th comment
GET /products/1/comments/latest // get the latest comment of product 1
GET /products/1/comments/latest/user // get the user of the latest comment

此外,您还可以直接访问评论

GET /comments/987                    // get the comment with id 987
GET /comments/987/user // get the user of comment with id 987

所以,我们有两个@RestController:

@RestController
@RequestMapping("/products/{productId}")
public class ProductsCommentsResource {

@GetMapping(value = "/comments")
public ResponseEntity<?> getComments(@PathVariable Long productId){
// get all products...
}

@GetMapping(value = "/comments/{commentNr}")
public ResponseEntity<?> getComment(@PathVariable Long productId, @PathVaraible Long commentNr){
// get comment with number commentNr of product productId
}

@GetMapping(value = "/comments/{commentNr}/user")
public ResponseEntity<?> getCommentUser(@PathVariable Long productId, @PathVaraible Long commentNr){
// get the user of comment with commentNr of productId
}

@GetMapping(value = "/comments/latest")
public ResponseEntity<?> getLatestComment(@PathVariable Long productId){
// get latest commentNr and call getComment(productId, commentNr)
}

@GetMapping(value = "/comments/latest/user")
public ResponseEntity<?> getLatestCommentUser(@PathVariable Long productId){
// get latest commentNr and call getCommentUser(productId, commentNr)
}
}

@RestController
@RequestMapping("/comments")
public class CommentsResource {
@GetMapping(value = "/{commentId}")
public ResponseEntity<?> getComment(@PathVaraible Long commentId){
// get comment id commentId
}

@GetMapping(value = "/{commentId}/user")
public ResponseEntity<?> getCommentUser(@PathVaraible Long commendId){
// get the user of comment with id commentId
}
}

因此,latest 只是“获取最后的 commentNr 并使用此 commentId 调用相应的方法”的替换关键字

这只是一个摘录,除了用户之外,一条评论还有大约 30 个子资源和子资源(包括方法 POST、DELETE 等)。因此,我们或多或少拥有三倍的一切。

所以,很明显,我们需要改进这一点,删除重复代码等。这个想法是“封装”评论资源,并通过使用在类中注释的 @RequestMapping 使其可重用。

我们考虑了一种机制,例如:

  • /products/1/comments/latest/user 被调用
  • 拦截调用并将产品1的“最新”解析为commentId
  • 调用将重定向到```/comments/{commendId}/user

因此,我们需要有一些可以重定向的东西 - /products/1/comments/latest[what ever]/comments/{commentId}[what ever] - /products/1/comments/5[what ever] 也到 /comments/{commentId}[what ever]

和/comments/{commentId} 将是唯一的实现。

但是,我们在spring docs中没有找到合适的...

最佳答案

您可以在 Controller 的 @RequestMapping 中添加额外的 URL 路径前缀。

@RequestMapping(value = { "/products/{productId}", "/" })

这意味着您可以删除 CommentsResource Controller 并且您将能够访问相同的资源:

/products/1/comments/5

/comments/5

例如,这里:

 @GetMapping(value = "/comments/{commentNr}")
public ResponseEntity<?> getComment(@PathVariable Long productId, @PathVaraible Long commentNr){
// get comment with number commentNr of product productId
}

明显的问题是 productId 路径变量。如果您使用的是 Java 8,可以通过使用 Optional 轻松解决:

@GetMapping(value = "/comments/{commentNr}")
public ResponseEntity<?> getComment(@PathVariable Optional<Long> productId, @PathVaraible Long commentNr){
// get comment with number commentNr of product productId
// Check whether productId exists
}

关于java - Spring REST 重用嵌套请求映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40781953/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com