web-dev-qa-db-ja.com

Web API SwaggerのすべてのAPIにヘッダーパラメーターを追加する方法

_web-api_のすべてのメソッドに自動的に追加されるリクエストヘッダーパラメーターを追加する方法を探しましたが、明確なものが見つかりませんでした。

検索中に、メソッドOperationFilter()がそれについて何かしなければならないことがわかりました。

16
user2245758

はい、あなたはIOperationFilterから継承することでそれを行うことができます

GitHubで答えを見つけることができます: AddRequiredHeaderParameter

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;

public class AddRequiredHeaderParameter : IOperationFilter
{
    public void Apply(Operation operation, OperationFilterContext context)
    {
        if (operation.Parameters == null)
            operation.Parameters = new List<IParameter>();

        operation.Parameters.Add(new NonBodyParameter
            {
                Name = "X-User-Token",
                In = "header",
                Type = "string",
                Required = false
            });
    }
}

次に、SwaggerConfig.csファイルを作成し、AddSwaggerGenセクションに以下を追加します。

c.OperationFilter<AddRequiredHeaderParameter>();

再構築し、お楽しみください。

27
Ramy Mohamed

カスタムヘッダーを追加するもう1つの方法は、コントローラーアクションにパラメーターを追加することです。
次の例では、x-test UIのパラメーター:

[HttpPost]
public IActionResult Test([FromHeader(Name="x-test")][Required] string requiredHeader)
{
    return Ok();
}

enter image description here

7
Pavel Agarkov

私はこれをわずかに異なる方法で行わなければなりませんでしたが、理由はわかりません。ヘッダー値を追加するために私がしたことは次のとおりです。

これは私のswagger設定に追加されました:

    c.OperationFilter<AddRequiredHeaderParameter>();

そして、これはクラスでした:

    public class AddRequiredHeaderParameter : IOperationFilter
    {
        public void Apply(Operation operation, OperationFilterContext context)
        {
            operation.Parameters.Add(new NonBodyParameter
            {
                Name = "X-MYHEADER",
                In = "header",
                Type = "string",
                Required = false
            });
        }
    }
3
Mr Giggles

ユーザー「G T」が書いたものは正しいですが、Swagger 5では機能しません。いくつかの新しい変更があります:From: "Operation" to: "OpenApiOperation"。 From: "IParameter" to: "OpenApiParameter"。 From: "NonBodyParameter" to: "OpenApiParameter"。そして最も重要なのは、「Type = "string"」から「Schema = new OpenApiSchema {Type = "String"}」です。

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace MyAPI
{
    public class AuthorizationHeaderParameterOperationFilter: IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            var filterPipeline = context.ApiDescription.ActionDescriptor.FilterDescriptors;
            var isAuthorized = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is AuthorizeFilter);
            var allowAnonymous = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAllowAnonymousFilter);

            if (isAuthorized && !allowAnonymous)
            {
                if (operation.Parameters == null)
                    operation.Parameters = new List<OpenApiParameter>();

                operation.Parameters.Add(new OpenApiParameter 
                {
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Description = "access token",
                    Required = true,
                    Schema = new OpenApiSchema
                    {
                        Type = "String",
                        Default = new OpenApiString("Bearer ")
                    }
                });
            }
        }
    }
}

そして、Startup => ConfigureServices(

c.OperationFilter<AuthorizationHeaderParameterOperationFilter>();
2
Wille Esteche

また、ベースモデルクラスを持ち、カスタムヘッダーで送信する必要があるプロパティに[FromHeader]属性を使用することもできます。このようなもの:

public class AuthenticatedRequest
{
    [FromHeader(Name = "User-Identity")]
    public string UserIdentity { get; set; }
}

少なくとも、ASP.NET Core 2.1およびSwashbuckle.AspNetCore 2.5.0では問題なく動作します。

0

Asp .Net MVC 5で使用できます。
Swagger Configファイルで行われる必要性に続きます。

private class AddAuthorizationHeaderParameter: IOperationFilter   // as a nested class in script config file.
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.parameters == null)
            operation.parameters = new List<Parameter>();

        operation.parameters.Add(new Parameter
        {
            name = "Authorization",
            @in = "header",
            type = "string",
            required = true
        });
    }
}

c.OperationFilter<AddAuthorizationHeaderParameter>(); // finally add this line in .EnableSwagger

Swaggerのヘッダー実装用にヘッダーを追加することもできます。

0
Rajat Nigam