.net core swagger 添加header参数。swagger传递jwt token 电脑版发表于:2022/6/13 0:01 ## .net core swagger 添加header参数 ### 方法一:使用FromHeader ``` [HttpGet] public ReturnModel<UserInfoModel> Get([FromHeader(Name = "userNr")][Required] string userNr) { string val = Request.Headers["userNr"]; ReturnModel<UserInfoModel> returnModel = new ReturnModel<UserInfoModel>(); return returnModel; } ``` 这种就给单个方法加想要获取的header参数 tn2>要注意不要使用这类方法写含有特殊意义的header参数,比如Authorization这种 ``` [HttpGet] public ReturnModel<UserInfoModel> Get([FromHeader(Name = "Authorization")][Required] string authorization) { string token = Request.Headers["Authorization"]; ReturnModel<UserInfoModel> returnModel = new ReturnModel<UserInfoModel>(); return returnModel; } ``` 如果写成这种swagger会把他忽略掉,你参数是传递不过去的,会报错: ![](https://img.tnblog.net/arcimg/aojiancc2/d41034a511d645cea5b7462b0c31ce23.png) 即时你确实对参数进行了传递还是会报错: ![](https://img.tnblog.net/arcimg/aojiancc2/dd55594ff61048b0a188b384e42f0ab5.png) 因为Authorization在swagger中是有特殊函数的,需要单独使用,后面会说到。当然这种只是swagger传递不了,你用postman或者前端调用其实也是可以传递的 ### 方法二:重写IOperationFilter实现 ``` public class AddRequiredHeaderParameter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { if (operation.Parameters == null) operation.Parameters = new List<OpenApiParameter>(); operation.Parameters.Add(new OpenApiParameter() { Name = "userNr", In = ParameterLocation.Header, Required = true }); operation.Parameters.Add(new OpenApiParameter() { Name = "periodNo", In = ParameterLocation.Header, Required = true }); } } ``` 然后在AddSwaggerGen中添加即可 ![](https://img.tnblog.net/arcimg/aojiancc2/ac5ac42c21f14e87bb1730cd5c33c365.png) 这样所有接口中都有这两个header参数了 ![](https://img.tnblog.net/arcimg/aojiancc2/f6aa7e2096fe42e18289939002e15766.png) tn2>当然这种方式也不要去添加有特殊函数的header参数会被忽略掉。鼠标指到name上面也有说明的。 ![](https://img.tnblog.net/arcimg/aojiancc2/f9a110dec76b402c8541bf8fa751c8b7.png) 这种方式其实也比较灵活比如配合AllowAnonymous等等特性使用,还可以配置一些模式什么的 ``` public class AddRequiredHeaderParameter : 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 = "name", In = ParameterLocation.Header, Description = "我是参数备注", Required = true, Schema = new OpenApiSchema { Type = "string", Default = new OpenApiString("Bearer ") } }); } } } ``` ## swagger传递jwt token swagger传递jwt token其实就是一种特殊的header类型,就是前面提到的,Authorization,它是有特殊的设置方法的。 也是在context.Services.AddSwaggerGen中设置 ``` var security = new Dictionary<string, IEnumerable<string>> { { "Bearer", new string[] { } } }; c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme() { Description = "JWT授权(数据将在请求头中进行传输) 在下方输入Bearer {token} 即可,注意两者之间有空格", Name = "Authorization", //jwt默认的参数名称 In = ParameterLocation.Header, //jwt默认存放Authorization信息的位置(请求头中) Type = SecuritySchemeType.ApiKey, }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference() { Id = "Bearer", Type = ReferenceType.SecurityScheme } }, Array.Empty<string>() } }); ``` **设置了之后就可以看到有锁的标识:** ![](https://img.tnblog.net/arcimg/aojiancc2/3ae59fde4c2744d3a49ef64be70d374a.png) 在最上面那个锁的标识位置点击,就可以看到弹窗,然后你可以设置一个值,点击Authorize ![](https://img.tnblog.net/arcimg/aojiancc2/acc8331afe4b429a90229fb7bf51dbce.png) 锁的样式就变成关闭的状态了: ![](https://img.tnblog.net/arcimg/aojiancc2/cdfc342e395e4d7fa24bce96c07b1c50.png) tn2>此时你随便调试一个接口,就可以把你填写的内容传递到后台去了。其实就是方便测试而已。 tn3> 其他相关应用贴一下: jwt的使用: https://www.tnblog.net/aojiancc2/article/details/2815 swagger版本控制: https://www.tnblog.net/aojiancc2/article/details/5951 webapi post传递参数:https://www.tnblog.net/aojiancc2/article/details/2815