UseSwaggerUI :: UseRequestInterceptor => 根据要求添加 api 版本
UseSwaggerUI :: UseRequestInterceptor => adding api version on request
正在尝试通过 Header 设置 API 版本控制。
所有其他东西都很好,解决了每个人都知道有 api 个具有相同端点的版本的现有冲突。
但是它有一个问题,因为它只会使用默认的 api 版本来请求;
在探索了一些其他选项之后,似乎最好的方法是处理“UseRequestInterceptor”;
我的问题是,我实际上对如何在这里声明要使用的函数一无所知;试图在注入的 javascript 文件上声明函数,但这似乎不是正确的方法。
身边的人可以给我线索吗?
谢谢
对于那些可能想要得到我想要的东西的人。
其实有2个答案:
- swagger 版本控制 header 请求
- 大摇大摆的 UseRequestInterceptor howTo\syntax.
对于试图添加 api 版本控制并为每个版本具有相同端点的人,您将遇到关于 2 种方法不可能具有相同端点的错误。文档说对于休息服务你不应该这样做 - 对我来说这不是一个正确的答案,因为虽然我可能追求不同的预期结果或不同的性能,但我不想破坏消费者。
所以第一个解决方法:
services.AddSwaggerGen(options =>
{
options.ResolveConflictingActions(o => o.FirstOrDefault());
options.SwaggerDoc("v1", new OpenApiInfo { Title = "api.swagger.Versioning", Version = "v1" });
options.SwaggerDoc("v2", new OpenApiInfo { Title = "api.swagger.Versioning", Version = "v2" });
});
通知解决冲突行;
这一行选择第一个版本,这将是好的 - 或者不是;
对于任何请求,它不会为版本 api 抛出 header。它将以您所做的任何请求结束,并将以默认版本为目标。不错!
在测试了一些选项并仔细阅读之后,有了使用 UseRequestInterceptor 的想法,但错过了有关如何使用的语法。
对于我的代码,我选择将 header 版本设置为“api”;
所以最后你会得到类似的东西:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCustomMiddleware();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(swaggerUiOptions =>
{
swaggerUiOptions.HeadContent = "Swagger API demo";
var fn = "(request) => { var swaggerSelect = document.querySelector('#swagger-ui .swagger-container .topbar select'); if(swaggerSelect) { var selected = swaggerSelect.selectedOptions; if( selected ) { var version = selected[0].text.split('|')[1]; request.headers['api']=version; } }; return request; }";
swaggerUiOptions.SwaggerEndpoint("/swagger/v1/swagger.json", "api.swagger.Versioning v1|1.0");
swaggerUiOptions.SwaggerEndpoint("/swagger/v2/swagger.json", "api.swagger.Versioning v2|2.0");
swaggerUiOptions.InjectJavascript("/js/inject.js");
swaggerUiOptions.UseRequestInterceptor(fn);
});
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
基本上我去寻找是否可以解析版本的值 - 当它成为可能时我将它添加到 header。
可能有一些更优雅的方法可以做到这一点,希望有人会来这里告诉我——但这是我自己想出来的。
我的代码示例:
https://github.com/figueiredorj/api.swagger
关于 Swashbuckle.AspNetCore 的旁注 - 它似乎从 6.0.7
开始有效
正在尝试通过 Header 设置 API 版本控制。 所有其他东西都很好,解决了每个人都知道有 api 个具有相同端点的版本的现有冲突。
但是它有一个问题,因为它只会使用默认的 api 版本来请求; 在探索了一些其他选项之后,似乎最好的方法是处理“UseRequestInterceptor”;
我的问题是,我实际上对如何在这里声明要使用的函数一无所知;试图在注入的 javascript 文件上声明函数,但这似乎不是正确的方法。
身边的人可以给我线索吗? 谢谢
对于那些可能想要得到我想要的东西的人。
其实有2个答案:
- swagger 版本控制 header 请求
- 大摇大摆的 UseRequestInterceptor howTo\syntax.
对于试图添加 api 版本控制并为每个版本具有相同端点的人,您将遇到关于 2 种方法不可能具有相同端点的错误。文档说对于休息服务你不应该这样做 - 对我来说这不是一个正确的答案,因为虽然我可能追求不同的预期结果或不同的性能,但我不想破坏消费者。
所以第一个解决方法:
services.AddSwaggerGen(options =>
{
options.ResolveConflictingActions(o => o.FirstOrDefault());
options.SwaggerDoc("v1", new OpenApiInfo { Title = "api.swagger.Versioning", Version = "v1" });
options.SwaggerDoc("v2", new OpenApiInfo { Title = "api.swagger.Versioning", Version = "v2" });
});
通知解决冲突行; 这一行选择第一个版本,这将是好的 - 或者不是;
对于任何请求,它不会为版本 api 抛出 header。它将以您所做的任何请求结束,并将以默认版本为目标。不错!
在测试了一些选项并仔细阅读之后,有了使用 UseRequestInterceptor 的想法,但错过了有关如何使用的语法。
对于我的代码,我选择将 header 版本设置为“api”;
所以最后你会得到类似的东西:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCustomMiddleware();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(swaggerUiOptions =>
{
swaggerUiOptions.HeadContent = "Swagger API demo";
var fn = "(request) => { var swaggerSelect = document.querySelector('#swagger-ui .swagger-container .topbar select'); if(swaggerSelect) { var selected = swaggerSelect.selectedOptions; if( selected ) { var version = selected[0].text.split('|')[1]; request.headers['api']=version; } }; return request; }";
swaggerUiOptions.SwaggerEndpoint("/swagger/v1/swagger.json", "api.swagger.Versioning v1|1.0");
swaggerUiOptions.SwaggerEndpoint("/swagger/v2/swagger.json", "api.swagger.Versioning v2|2.0");
swaggerUiOptions.InjectJavascript("/js/inject.js");
swaggerUiOptions.UseRequestInterceptor(fn);
});
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
基本上我去寻找是否可以解析版本的值 - 当它成为可能时我将它添加到 header。
可能有一些更优雅的方法可以做到这一点,希望有人会来这里告诉我——但这是我自己想出来的。
我的代码示例: https://github.com/figueiredorj/api.swagger
关于 Swashbuckle.AspNetCore 的旁注 - 它似乎从 6.0.7
开始有效