Web Api How to add a Header parameter for all API in Swagger

后端 未结 7 932
温柔的废话
温柔的废话 2020-11-27 16:54

I searched for possible ways to add a request header parameter that would be added automatically to every method in my web-api but i couldn\'t find a clear one.

相关标签:
7条回答
  • 2020-11-27 16:57

    Yes you can do it via inheriting from IOperationFilter

    You can find the answer on GitHub here: 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
                });
        }
    }
    

    Then you go to your SwaggerConfig.cs file and add the following in the AddSwaggerGen section:

    c.OperationFilter<AddRequiredHeaderParameter>();
    

    Rebuild, and enjoy.

    0 讨论(0)
  • 2020-11-27 17:03

    If swagger is used in ASP.Net MVC5, and required to add headers to get input from swagger UI.

    Create a class inherited from IOperationFilter:

    using Swashbuckle.Swagger;
    using System.Collections.Generic;
    using System.Web.Http.Description;
    
    public class AddHeaderParameters : IOperationFilter
    {
        public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
        {
            if (operation.parameters == null)
                operation.parameters = new List<Parameter>();
    
            operation.parameters.Add(new Parameter
            {
                name = "AccountUserName",
                @in = "header",
                type = "string",
                required = true,
                //description = "Account username"
            });    
        }
    }
    

    Give reference of this class in SwaggerConfig.cs inside Configuration.EnableSwagger as:

    c.OperationFilter<AddHeaderParameters>();
    

    Important thing to note that the header name supposed to match with the actual header you have created for API.

    0 讨论(0)
  • 2020-11-27 17:10

    I have improved the respectful Wille Esteche's answer a bit. If you want to apply headers not to all methods, but only to your selected controller methods, you can use attributes.

        [HttpPost]
        [Route(nameof(Auth))]
        [SwaggerHeader(Constants.HeaderDomainSid, "Encrypted User.Sid got from client", "abc123", true)]
        public ActionResult<string> Auth([FromHeader(Name = Constants.HeaderDomainSid)] string headerDomainSid = null)
        { .....
        
    

    Attribute class:

    public class SwaggerHeaderAttribute : Attribute
    {
        public string HeaderName { get; }
        public string Description { get; }
        public string DefaultValue { get; }
        public bool IsRequired { get; }
    
        public SwaggerHeaderAttribute(string headerName, string description = null, string defaultValue = null, bool isRequired = false)
        {
            HeaderName = headerName;
            Description = description;
            DefaultValue = defaultValue;
            IsRequired = isRequired;
        }
    }
    

    Filter:

    public class SwaggerHeaderFilter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            operation.Parameters ??= new List<OpenApiParameter>();
    
            if (context.MethodInfo.GetCustomAttribute(typeof(SwaggerHeaderAttribute)) is SwaggerHeaderAttribute attribute)
            {
                var existingParam = operation.Parameters.FirstOrDefault(p =>
                    p.In == ParameterLocation.Header && p.Name == attribute.HeaderName);
                if (existingParam != null) // remove description from [FromHeader] argument attribute
                {
                    operation.Parameters.Remove(existingParam);
                }
    
                operation.Parameters.Add(new OpenApiParameter
                {
                    Name = attribute.HeaderName,
                    In = ParameterLocation.Header,
                    Description = attribute.Description,
                    Required = attribute.IsRequired,
                    Schema = string.IsNullOrEmpty(attribute.DefaultValue)
                        ? null
                        : new OpenApiSchema
                        {
                            Type = "String",
                            Default = new OpenApiString(attribute.DefaultValue)
                        }
                });
            }
        }
    }
        
    

    0 讨论(0)
  • 2020-11-27 17:11

    Another way to add custom headers is by adding parameters into controller action.
    The following example will add x-test parameter to the UI:

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

    0 讨论(0)
  • 2020-11-27 17:11

    For Asp .Net MVC 5 you can use.
    Following the need to be done in Swagger Config file.

    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
    

    You can also add any no of headers for header implementation in Swagger.

    0 讨论(0)
  • 2020-11-27 17:11

    Also you may have a base model class and use attribute [FromHeader] for properties which should be sent in custom headers. Something like this:

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

    At least it works fine for ASP.NET Core 2.1 and Swashbuckle.AspNetCore 2.5.0.

    0 讨论(0)
提交回复
热议问题