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

开始有效