控制器应该采用 "id" 作为 PathVariable 还是应该采用 "page-id"

Should controller take "id" as PathVariable or should it take "page-id"

我们正在努力创建 SEO 友好的道路。在这种情况下,我们决定对 url 进行更改。 例如:/141(id) --> /example-page-141

我认为我们应该在后端获取“id”值作为 PathVariable。另一种解决方案是将“/example-page-141”作为@PathVariable 并在其中找到 141。哪个是正确的解决方案?

  1. 解决方案

      @GetMapping("/get/{id}")
    public ResponseEntity<?> getProductDetail(@PathVariable Long id) 
    
        Product product = productService.getProductDetail(id);
    
        return new ResponseEntity<>(product, HttpStatus.OK);
    }
    
  2. 解决方案

     @GetMapping("/get/{id}")
     public ResponseEntity<?> getProductDetail(@PathVariable String id) {
    
    String[] bits = id.split("-");
    
    Long idLong = Long.valueOf(bits[bits.length-1]);
    
    Product product = productService.getProductDetail(idLong);
    
    return new ResponseEntity<>(product, HttpStatus.OK);
     }
    

从后端或前端拆分的优缺点是什么?

这里没有非黑即白的答案,因为使用它们中的任何一种都没有真正的危害。

但是,如果您采用方法#2,您将处理以下问题:

  1. 您正在绑定 URL 或路径参数以具有固定模式,即 x-x-x-<page_no>
  2. 另外,后端不必要的字符串处理开销。

选择权在你! :)

我会选择选项 1。为什么?因为它将拆分逻辑保留在它所属的前端。 SEO 与前端的关系比与后端的关系更密切,因此,您应该从后端服务中隐藏这种复杂性。

一个额外的好处是,如果在某个时间点 ID 前缀发生变化,您可以将更改保留在一个地方(前端),而不是在前端和后端都需要同步更改,以便后端服务继续能够响应请求(当然你可以有一个替代方案,但底线是你需要接触两个代码库而不是一个)。