我正在使用Swashbuckle(C#的招摇)与我的Web API。我有几个返回列表的 GET endpoint,我允许用户将每页和页面参数添加到 QueryString 中
例如:http://myapi.com/endpoint/?page=5
我看到 swagger 确实支持“查询”中的参数,但我如何让 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;
}
使用Swagger配置注册属性:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.OperationFilter<SwaggerParametersAttributeHandler>();
});
然后将此属性添加到您的方法中:
[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)]
这里有一些关于 SwaggerParametersAttributeHandler 上缺失信息的评论。它是一个操作过滤器,可帮助您确定要对属性执行的操作。
下面是我使用的一个示例处理程序,它允许我使用SwaggerParameterAttribute覆盖可空参数的必填字段。
public class RequiredParameterOverrideOperationFilter : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
// Get all SwaggerParameterAttributes on the method
var attributes = apiDescription.ActionDescriptor.GetCustomAttributes<SwaggerParameterAttribute>();
if (operation.parameters == null)
{
operation.parameters = new List<Parameter>();
}
// For each attribute found, find the operation parameter (this is where Swagger looks to generate the Swagger doc)
// Override the required fields based on the attribute's required field
foreach (var attribute in attributes)
{
var referencingOperationParameter = operation.parameters.FirstOrDefault(p => p.name == attribute.Name);
if (referencingOperationParameter != null)
{
referencingOperationParameter.required = attribute.Required;
}
}
}
}
以下是属性方法所需步骤的摘要(ASP. Net Core 2.1、Swashuckle. 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;
}
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
});
}
}
在启动时添加这个。配置服务
using Swashbuckle.AspNetCore.Swagger;
services.AddSwaggerGen(c =>
{
c.OperationFilter<SwaggerParameterAttributeFilter>();
c.SwaggerDoc("v1.0", new Info { Title = "My API", Version = "v1.0" });
});
并像这样使用:
[SwaggerParameter("$top", "Odata Top parameter", DataType = "integer", ParameterType ="query")]
数据类型可以是:整数、字符串、布尔值
参数类型:可以是路径、正文、查询
您可以很容易地实现这一点。假设您有一个ItemsControl ler
,其操作如下所示:
[Route("/api/items/{id}")]
public IHttpActionResult Get(int id, int? page = null, int? perpage = null)
{
// some relevant code
return Ok();
}
Swashbarle将生成此规范(仅显示相关部分):
"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"
}
]
}
}
当您希望需要<code>page</code>和<code>perpage</code>时,只需使参数不可为空即可。
问题内容: 我正在使用Commons HttpClient对Spring servlet进行http调用。我需要在查询字符串中添加一些参数。因此,我执行以下操作: 但是,当我尝试使用读取servlet中的参数时 它返回null。实际上parameterMap是完全空的。当我在创建HttpGet请求之前将参数手动添加到url时,该参数在servlet中可用。当我使用附加了queryString的UR
问题内容: 我是Java新手,所以我几乎不需要帮助 我有 我想向此数组(脚本)添加新的字符串(string1,string2)作为示例 我想在以后的阶段中不添加新字符串 我该怎么办? 问题答案: 您无法在Java中调整数组的大小。 声明数组的大小后,它将保持固定。 相反,您可以使用具有动态大小的对象,这意味着您无需担心其大小。如果数组列表的大小不足以容纳新值,则它将自动调整大小。
假设我有一个URL,其路径为: 如何将其转换为大摇大摆的文档,具体地说,将对象数组和数组作为查询参数。
问题内容: 使用javascript,如何将查询字符串参数添加到url(如果不存在)或如果存在,则更新当前值?我正在使用jquery进行客户端开发。 问题答案: 我编写了以下函数来实现我想要实现的功能:
我从客户端发送了以下查询字符串参数 在REST服务器中,我如何接收上述格式并正确分配给每个类别? 更新1 参数的值为 {_=[1437904506062],{“take”:75,“skip”:0,“page”:1,“pageSize”:75、“filter”:{“logic”:“and”,“filters”:〔{“field”:“prodCode”,“operator”:“eq”,“value”:
我找到了这个项目https://github.com/OAI/OpenAPI-Specification据我所知,我们可以用文件。而且,我能看到http://editor.swagger.io/它可以被渲染成文件。 我的问题是-我怎么能生成静态页面从文件?有任何教程的Spring引导应用程序吗?我应该以某种方式设置文件昂首阔步的配置和获得文件留档?