【问题标题】:Web API Documentation using swagger使用 swagger 的 Web API 文档
【发布时间】:2017-04-19 17:24:55
【问题描述】:

我是 swagger 的新手,我看过一些在线文档来将 Swagger 实现到我的 webapi 并使用 SwaggerConfig 的一些属性进行自定义。

这是我的要求:- 我只需要根据“API_Key”文本框的值在“探索”按钮上显示招摇文档,该值应该与我的 app.config 键匹配。

所以我看到这样实现:-

  1. 用户来到我的swagger主页,默认情况下它将有空文档,除了如图所示的标题。
  2. 在标题中提供的文本框中输入 API_Key,然后单击浏览。
  3. 使用我的 app.config 或 SwaggerConfig 中的密钥验证输入的 API 密钥。
  4. 如果验证显示文档,则将错误消息显示为无效的 API 密钥。

需要建议。

亲切的问候, 拉古

【问题讨论】:

    标签: c# .net swagger-ui swagger-2.0 swashbuckle


    【解决方案1】:

    只需编辑index.html 并在addApiKeyAuthorization 更改事件中添加您需要的标题。在这里查看更多:

    https://github.com/swagger-api/swagger-ui#header-parameters

    【讨论】:

    • 感谢您的回答,但使用它实际上会将参数“API Key”添加到请求的标头中,我们可以使用它来验证文档中的每个调用,但我的要求是,我不应该在没有有效 API 密钥的情况下加载文档本身(有效 API 密钥:- 应该与我的 app.config 密钥匹配)
    • 如果我必须更清楚地说明我的评论,请告诉我。我会进一步阐述
    • 所以我看到实现如下:- 1. 用户来到我的招摇主页,默认情况下除了标题之外它将为空。 2. 在标题提供的文本框中输入 API_Key,然后单击浏览。 3. 使用我的 app.config 或 SwaggerConfig 中的密钥验证输入的 API 密钥。 4. 如果验证显示文档,否则将错误消息显示为无效 API 密钥。
    • 好的,知道了。然后在这种情况下,您可能希望加载 swaggerUi,直到 addApiKeyAuthorization。也可以这样设置,然后加载时发送。这有意义吗?
    • 是的,我正在考虑这种方式,但是我们需要注入 js,进行所需的操作并以与默认情况下 Swashbuckle 加载相同的方式加载 swagger UI 对吗?
    【解决方案2】:

    您可以为 web api 添加自定义消息处理程序,然后向文档发出授权请求:

        private const string swaggerApikey = "swagger-apiKey";
    
        private void Configuration([NotNull] IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.MessageHandlers.Add(new SwaggerMessageHandler());
            config
                .EnableSwagger(c =>
                {
                    c.ApiKey(swaggerApikey)
                        .Description(swaggerApikey)
                        .Name(swaggerApikey)
                        .In("header");
                })
                .EnableSwaggerUi(c =>
                {
                    c.EnableApiKeySupport(swaggerApikey, "header");
                });
    
            app.UseWebApi(config);
        }
    
        internal class SwaggerMessageHandler : DelegatingHandler
        {
            protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                if (request.RequestUri.LocalPath.Equals("/swagger/docs/v1"))
                {
                    var apikey = request.Headers.FirstOrDefault(x => x.Key.Equals(swaggerApikey)).Value?.FirstOrDefault();
                    if (!"secretApiKey".Equals(apikey))
                        return Task.FromResult(new HttpResponseMessage(HttpStatusCode.Forbidden));
                }
                return base.SendAsync(request, cancellationToken);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2017-03-08
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      相关资源
      最近更新 更多