需要 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/ger
和api/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的主要内容,如果未能解决你的问题,请参考以下文章
在查询中找到 @client 指令,但未指定 ApolloClient 解析器
使用 Jackson 根据 API 版本指定不同的 JSON 属性名称