控制器应该采用 "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。哪个是正确的解决方案?
解决方案
@GetMapping("/get/{id}")
public ResponseEntity<?> getProductDetail(@PathVariable Long id)
Product product = productService.getProductDetail(id);
return new ResponseEntity<>(product, HttpStatus.OK);
}
解决方案
@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,您将处理以下问题:
- 您正在绑定 URL 或路径参数以具有固定模式,即
x-x-x-<page_no>
。
- 另外,后端不必要的字符串处理开销。
选择权在你! :)
我会选择选项 1。为什么?因为它将拆分逻辑保留在它所属的前端。 SEO 与前端的关系比与后端的关系更密切,因此,您应该从后端服务中隐藏这种复杂性。
一个额外的好处是,如果在某个时间点 ID 前缀发生变化,您可以将更改保留在一个地方(前端),而不是在前端和后端都需要同步更改,以便后端服务继续能够响应请求(当然你可以有一个替代方案,但底线是你需要接触两个代码库而不是一个)。
我们正在努力创建 SEO 友好的道路。在这种情况下,我们决定对 url 进行更改。 例如:/141(id) --> /example-page-141
我认为我们应该在后端获取“id”值作为 PathVariable。另一种解决方案是将“/example-page-141”作为@PathVariable 并在其中找到 141。哪个是正确的解决方案?
解决方案
@GetMapping("/get/{id}") public ResponseEntity<?> getProductDetail(@PathVariable Long id) Product product = productService.getProductDetail(id); return new ResponseEntity<>(product, HttpStatus.OK); }
解决方案
@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,您将处理以下问题:
- 您正在绑定 URL 或路径参数以具有固定模式,即
x-x-x-<page_no>
。 - 另外,后端不必要的字符串处理开销。
选择权在你! :)
我会选择选项 1。为什么?因为它将拆分逻辑保留在它所属的前端。 SEO 与前端的关系比与后端的关系更密切,因此,您应该从后端服务中隐藏这种复杂性。
一个额外的好处是,如果在某个时间点 ID 前缀发生变化,您可以将更改保留在一个地方(前端),而不是在前端和后端都需要同步更改,以便后端服务继续能够响应请求(当然你可以有一个替代方案,但底线是你需要接触两个代码库而不是一个)。