V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
pangtianyu
V2EX  ›  问与答

关于根据版本号改动 API 返回值的问题

  •  
  •   pangtianyu · 2021-12-20 15:48:06 +08:00 · 1264 次点击
    这是一个创建于 851 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个问题想请教一下各位大佬。我有一个 API 服务,部分元素会根据不同 version 返回不同的内容。例如:

    // version 1.0.0
    {
      "data": {
        "a": "a1", 
        "b": "b1", 
        "c": "c1", 
        "d": "d1"
      }
    }
    
    // version 1.0.1
    {
      "data": {
        "a": "a1-1.0.1",  // a 在 1.0.1 版本更新了内容,其余元素不变
        "b": "b1", 
        "c": "c1", 
        "d": "d1"
      }
    }
    
    // verison 2.0.0
    {
      "data": {
        "a": "a1-1.0.1",  // a 在 2.0.0 版本未更新内容,保持最新的 1.0.1 版本的内容
        "b": "b1", 
        "c": "c1-2.0.0",  // c 在 2.0.0 版本更新了内容
        "d": "d1"
      }
    }
    
    // verison 2.0.6
    {
      "data": {
        "a": "a1-2.0.6",  // a 更新到了 2.0.6
        "b": "b1-2.0.6", 
        "c": "c1-2.0.0",  // c 保持 2.0.0 不变
        "d": "d1"
      }
    }
    

    这些元素都是从配置文件去获取的。我现在的做法是每次版本更新都要改动代码加 if else 。想请教一下有没有什么办法不改动代码,只改配置文件,根据传进来的版本号直接拿到期望的元素值?

    5 条回复    2021-12-29 16:38:31 +08:00
    yuxiu
        1
    yuxiu  
       2021-12-20 17:59:15 +08:00
    加一个配置层,如 redis ,业务层订阅对应 channel 事件,根据对应版本号请求开放接口
    chinvo
        2
    chinvo  
       2021-12-20 18:52:17 +08:00 via iPhone
    asp.net 官方有 api versioning 的 middleware

    其他语言应该也有吧
    liuzhaowei55
        3
    liuzhaowei55  
       2021-12-20 20:18:28 +08:00 via iPhone
    java 的 easyopen 框架可以,但不太推荐这个,感觉不好用
    sqfphoenix
        4
    sqfphoenix  
       2021-12-21 09:00:51 +08:00
    不同版本的服务都各自上线,网关根据前端传的版本把流量打到不同版本的服务就好了
    pangtianyu
        5
    pangtianyu  
    OP
       2021-12-29 16:38:31 +08:00
    @yuxiu
    能具体展开吗……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3044 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:04 · PVG 19:04 · LAX 04:04 · JFK 07:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.