You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

REST API:含空格字符串搜索的正确动词、路径及Trainer查询实现优化

原实现的问题

你的实现技术上能跑通,但有几个明显的槽点:

  • URL里带空格得转成Joe%20Bloggs这种编码格式,前端调用麻烦,用户看URL也费劲
  • REST设计里,路径参数一般用来定位唯一资源(比如/trainers/123),用它做过滤条件不符合规范
  • 以后要加其他过滤条件(比如按地区、年龄),路径会变得又长又乱,不好维护
推荐的替代方案

方案1:用查询参数(最推荐)

把姓名作为查询参数传递,这是REST里过滤资源的标准做法,扩展性和可读性都拉满:

@GetMapping("/v1/trainers")
public List<TrainerDTO> findTrainersByName(@RequestParam("name") String trainerName) {
    return trainerService.findTrainersByName(trainerName);
}

调用的时候直接传GET /v1/trainers?name=Joe Bloggs就行,浏览器或者HTTP客户端会自动处理空格的编码,完全不用你操心。要是以后要加模糊匹配(比如找所有名字里带"Joe"的教练),直接在service层改查询逻辑,接口不用动。

方案2:拆分姓和名

如果业务上需要分别匹配名和姓,避免拼接带来的歧义(比如重名情况),可以拆成两个查询参数:

@GetMapping("/v1/trainers")
public List<TrainerDTO> findTrainersByFullName(
    @RequestParam("firstName") String firstName,
    @RequestParam("lastName") String lastName
) {
    return trainerService.findTrainersByFullName(firstName, lastName);
}

调用示例:GET /v1/trainers?firstName=Joe&lastName=Bloggs,这种方式更精准,适合需要严格区分名和姓的场景。

方案3:硬用路径参数(不推荐)

要是你非得用路径参数,也不是不行,但得让前端把姓名做URL编码,后端框架会自动解码:

@GetMapping("/v1/trainers/name/{trainerName}")
public List<TrainerDTO> findTrainersByName(@PathVariable String trainerName) {
    // 比如传入Joe%20Bloggs,框架会自动转成Joe Bloggs
    return trainerService.findTrainersByName(trainerName);
}

但这种方式还是没解决可读性差、扩展难的问题,除非有特殊业务要求,否则别用。

内容的提问来源于stack exchange,提问作者java12399900

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:08:42