Jas*_*n H 7 c# swagger swashbuckle
我正在使用我的Web API使用Swashbuckle(swagger for C#).我有几个返回列表的GET端点,我允许用户在QueryString中添加perpage和page params
示例:http://myapi.com/endpoint/?page = 5&eachpage = 10
我看到swagger确实支持'query'中的参数但是我如何让Swashbuckle去做呢?
我在其中一条评论中提到我通过创建自定义属性来解决我的问题,以便让我做我需要的事情.以下是我的解决方案的代码:
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public class SwaggerParameterAttribute : Attribute
{
public SwaggerParameterAttribute(string name, string description)
{
Name = name;
Description = description;
}
public string Name { get; private set; }
public Type DataType { get; set; }
public string ParameterType { get; set; }
public string Description { get; private set; }
public bool Required { get; set; } = false;
}
Run Code Online (Sandbox Code Playgroud)
使用Swagger配置注册属性:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.OperationFilter<SwaggerParametersAttributeHandler>();
});
Run Code Online (Sandbox Code Playgroud)
然后将此属性添加到您的方法:
[SwaggerParameter("page", "Page number to display", DataType = typeof(Int32), ParameterType = ParameterType.inQuery)]
[SwaggerParameter("perpage","Items to display per page", DataType = typeof(Int32), ParameterType = ParameterType.inQuery)]
Run Code Online (Sandbox Code Playgroud)
你可以很容易地实现这一目标.假设您有一个这样ItemsController的动作:
[Route("/api/items/{id}")]
public IHttpActionResult Get(int id, int? page = null, int? perpage = null)
{
// some relevant code
return Ok();
}
Run Code Online (Sandbox Code Playgroud)
Swashbuckle将生成此规范(仅显示相关部分):
"paths":{
"/api/items/{id}":{
"get":{
"parameters":[
{
"name":"id",
"in":"path",
"required":true,
"type":"integer",
"format":"int32"
},
{
"name":"page",
"in":"query",
"required":false,
"type":"integer",
"format":"int32"
},
{
"name":"limit",
"in":"query",
"required":false,
"type":"integer",
"format":"int32"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
如果需要page和perpage需要,只需使参数不可为空.
小智 5
以下是 Attribute 方法所需步骤的摘要(ASP.Net Core 2.1、Swashbuckle.AspNetCore v4.0.1)。我需要一个以“$”开头的参数,所以可选参数不是一个选项!
SwaggerParameterAttribute.cs
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public class SwaggerParameterAttribute : Attribute
{
public SwaggerParameterAttribute(string name, string description)
{
Name = name;
Description = description;
}
public string Name { get; private set; }
public string DataType { get; set; }
public string ParameterType { get; set; }
public string Description { get; private set; }
public bool Required { get; set; } = false;
}
Run Code Online (Sandbox Code Playgroud)
SwaggerParameterAttributeFilter.cs
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Linq;
public class SwaggerParameterAttributeFilter : IOperationFilter
{
public void Apply(Operation operation, OperationFilterContext context)
{
var attributes = context.MethodInfo.DeclaringType.GetCustomAttributes(true)
.Union(context.MethodInfo.GetCustomAttributes(true))
.OfType<SwaggerParameterAttribute>();
foreach (var attribute in attributes)
operation.Parameters.Add(new NonBodyParameter
{
Name = attribute.Name,
Description = attribute.Description,
In = attribute.ParameterType,
Required = attribute.Required,
Type = attribute.DataType
});
}
}
Run Code Online (Sandbox Code Playgroud)
在 Startup.ConfigureServices 中添加这个
using Swashbuckle.AspNetCore.Swagger;
services.AddSwaggerGen(c =>
{
c.OperationFilter<SwaggerParameterAttributeFilter>();
c.SwaggerDoc("v1.0", new Info { Title = "My API", Version = "v1.0" });
});
Run Code Online (Sandbox Code Playgroud)
并像这样使用:
[SwaggerParameter("$top", "Odata Top parameter", DataType = "integer", ParameterType ="query")]
Run Code Online (Sandbox Code Playgroud)
数据类型可以是:整数、字符串、布尔值
ParameterTypes:可以是路径、正文、查询
| 归档时间: |
|
| 查看次数: |
9375 次 |
| 最近记录: |