需要 API 版本,但未指定。网页API

Posted

技术标签:

【中文标题】需要 API 版本,但未指定。网页API【英文标题】:An API version is required, but was not specified. webapi 【发布时间】:2018-08-31 02:57:28 【问题描述】:
var constraintResolver = new DefaultInlineConstraintResolver()

    ConstraintMap =
    
        ["apiVersion"] = typeof( ApiVersionRouteConstraint )
    
;
                
config.MapHttpAttributeRoutes(constraintResolver);
config.AddApiVersioning(o => o.AssumeDefaultVersionWhenUnspecified = true);


[ApiVersion("2.05")]
[RoutePrefix("api/vversion:apiVersion/ger")]
public class caGerController
[Route("~/api/ger/getDetail")]
[Route("getDetail")]
 GetGerData


[ApiVersion("1")]
[RoutePrefix("api/vversion:apiVersion/gerDetail")]

public class caGerDetailsController
caGerController
[Route("~/api/gerDetail/getDetail")]
[Route("getDetail")]
 GetGerData
   
>>  GetGerData

结果:

    这两个 URL 都适用于 v1 版本的 ROUTE。

    第二个 URL 同时适用于 v1 和没有 v1 路由的直接 URL,即 [Route("~/api/gerDetail/getDetail")]

    问题:第一个 URL 仅适用于 v1,它不适用于像“[Route("~/api/ger/getDetail")]”这样的直接路由 并得到如下错误:

    “错误”: "代码": "ApiVersionUnspecified", “消息”:“需要 API 版本,但未指定。”

如何解决这个问题? 当我从 2.05 更改为 1.0 时,它可以工作,但 2.0 或 2.05 都不起作用。是否需要单独的文件夹?

【问题讨论】:

【参考方案1】:

ApiVersionUnspecified 发生是因为 all 路由默认需要明确的 API 版本。您使用以下方式选择退出此行为:

options.AssumeDefaultVersionWhenUnspecified = true

此设置意味着当客户端未提供默认 API 版本时,将假定该版本。默认值为:

options.DefaultApiVersion // equals 1.0 by default

当您使用 URL 段版本控制方法时,您不能有两个不同的控制器同时 unversioned 路由。没有 API 版本的路由只能映射到单个控制器。由于默认值为“1.0”,并且您有一个带有 unversioned 路由的控制器,因此它始终会被匹配。

【讨论】:

如何指定版本? 如何指定 API 版本取决于您使用的版本控制风格。在原始问题中,正在使用 URL 分段方法。这意味着请求以api/v1/ger 的形式指定API 版本。使用这种版本控制风格,如果你想要一个 default 版本,那么你需要第二条路线(例如api/ger)。设置路由和options.AssumeDefaultVersionWhenUnspecified = true 后,路由api/v1/gerapi/ger 将执行相同的实现。【参考方案2】:

通过添加 API 版本控制,默认行为是使用 QueryString 版本控制。

   config.AddApiVersioning(cfg => );

api-version=1.0

要指定版本,可以在末尾添加查询字符串参数api-version=1.0

例子:

http://localhost:6600/api/test?api-version=1.0

您可以像这样更改版本:

protected void Application_Start()
    
      AreaRegistration.RegisterAllAreas();
      GlobalConfiguration.Configure(WebApiConfig.Register);
...

    public static void Register(HttpConfiguration config)
    
       ...
      config.AddApiVersioning(cfg =>
      
         cfg.DefaultApiVersion = new ApiVersion(1,1);
      );

所以你可以像这样更改版本:

http://localhost:6600/api/test?api-version=1.1

通过添加 AssumeDefaultVersionWhenUnspecified,您不必指定版本。

  config.AddApiVersioning(cfg =>
  
     cfg.DefaultApiVersion = new ApiVersion(1,1);
     cfg.AssumeDefaultVersionWhenUnspecified = true;
  );

这将起作用: http://localhost:6600/api/test

您还可以添加 ReportApiVersions

  config.AddApiVersioning(cfg =>
  
     cfg.DefaultApiVersion = new ApiVersion(1,1);
     cfg.AssumeDefaultVersionWhenUnspecified = true;
     cfg.ReportApiVersions = true;
  );

响应将有一个新的标头 api-supported-versions,它指定了他们所做的调用支持哪些版本。

【讨论】:

以上是关于需要 API 版本,但未指定。网页API的主要内容,如果未能解决你的问题,请参考以下文章

迁移会创建意外的 ID 字段,但未明确指定

在查询中找到 @client 指令,但未指定 ApolloClient 解析器

使用 Jackson 根据 API 版本指定不同的 JSON 属性名称

CUICatalog:无效请求:请求子类型但未指定惯用语

写入 Google Play 排行榜 API 回调成功返回,但未记录分数

无效属性:预期的数组,但未定义