Rest 什么是正确的api uri版本格式?

Rest 什么是正确的api uri版本格式?,rest,api,web-services,Rest,Api,Web Services,我从以前的开发人员那里继承了一个开发中的API,该开发人员使用以下API uri模式进行版本控制: 这是API版本控制的正确格式吗?例如,如果客户机需要v2用户API,则以下uri格式将显示为指示用户存在v2 API,但不一定所有实体都存在v2 API: 因此,第二个uri看起来更细粒度。这些模式中的一种比另一种更正确还是更常用?我会使用前者:/api/v1/users/,因为: 如果新版本的API作为web应用程序的单独实例公开,那么配置站点范围的路由就容易多了:只需将/API/v1/.

我从以前的开发人员那里继承了一个开发中的API,该开发人员使用以下API uri模式进行版本控制:

这是API版本控制的正确格式吗?例如,如果客户机需要v2用户API,则以下uri格式将显示为指示用户存在v2 API,但不一定所有实体都存在v2 API:


因此,第二个uri看起来更细粒度。这些模式中的一种比另一种更正确还是更常用?

我会使用前者:
/api/v1/users/
,因为:

  • 如果新版本的API作为web应用程序的单独实例公开,那么配置站点范围的路由就容易多了:只需将
    /API/v1/..
    之后的所有请求路由到旧版本,并将
    /API/v2/..
    路由到新版本。如果
    v2
    位于URI的末尾,那么配置路由将是一件痛苦的事情
  • 新版本的API可能会使更高级别的API过时,例如,如果“用户”被替换为“身份”,该怎么办?那么“v2”后缀就没有意义了
  • 资源路径是层次结构-在资源后面有一个版本指示符应用于引用该资源的版本,例如,如果您想获取用户123的状态的第二个快照,然后可能是
    /api/users/123/v2
    ,要获得第300个快照,那么
    /api/users/123/v300
    ——将api版本信息放在那里会使这一点变得不清楚
  • 资源路径应该按照“从最小到最具体”的顺序从左到右。最后的API版本打乱了逻辑顺序
  • 类似地,
    /api/v1/users
    表示“api版本1下的用户”,而不是
    /api/users/v1
    ,在这种情况下,它变得不清楚(“api版本1用户”?“api下名为“v1”的用户?”,等等)
还有其他方法需要考虑:如果版本控制只涉及DTO的不同架构版本,而基础数据和业务逻辑保持不变,则可以让客户端在querystring值中指定所需的DTO架构版本:

GET /api/users/123?dtoVersion=1
GET /api/users/123?dtoVersion=2

我会使用前者:
/api/v1/users/
,因为:

  • 如果新版本的API作为web应用程序的单独实例公开,那么配置站点范围的路由就容易多了:只需将
    /API/v1/..
    之后的所有请求路由到旧版本,并将
    /API/v2/..
    路由到新版本。如果
    v2
    位于URI的末尾,那么配置路由将是一件痛苦的事情
  • 新版本的API可能会使更高级别的API过时,例如,如果“用户”被替换为“身份”,该怎么办?那么“v2”后缀就没有意义了
  • 资源路径是层次结构-在资源后面有一个版本指示符应用于引用该资源的版本,例如,如果您想获取用户123的状态的第二个快照,然后可能是
    /api/users/123/v2
    ,要获得第300个快照,那么
    /api/users/123/v300
    ——将api版本信息放在那里会使这一点变得不清楚
  • 资源路径应该按照“从最小到最具体”的顺序从左到右。最后的API版本打乱了逻辑顺序
  • 类似地,
    /api/v1/users
    表示“api版本1下的用户”,而不是
    /api/users/v1
    ,在这种情况下,它变得不清楚(“api版本1用户”?“api下名为“v1”的用户?”,等等)
还有其他方法需要考虑:如果版本控制只涉及DTO的不同架构版本,而基础数据和业务逻辑保持不变,则可以让客户端在querystring值中指定所需的DTO架构版本:

GET /api/users/123?dtoVersion=1
GET /api/users/123?dtoVersion=2