


.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参数
要注意不要使用这类方法写含有特殊意义的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会把他忽略掉,你参数是传递不过去的,会报错:
即时你确实对参数进行了传递还是会报错:
因为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中添加即可
这样所有接口中都有这两个header参数了
当然这种方式也不要去添加有特殊函数的header参数会被忽略掉。鼠标指到name上面也有说明的。
这种方式其实也比较灵活比如配合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>()
}
});
设置了之后就可以看到有锁的标识:
在最上面那个锁的标识位置点击,就可以看到弹窗,然后你可以设置一个值,点击Authorize
锁的样式就变成关闭的状态了:
此时你随便调试一个接口,就可以把你填写的内容传递到后台去了。其实就是方便测试而已。
其他相关应用贴一下:
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
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)