cod*_*ove 8 c# json asp.net-web-api swagger swashbuckle
目标:我正在设计一个REST API,允许用户在查询字符串上传递HTTP GET请求的参数.就像是
http://fake.api.com/search?api-key=1235&term=car&rows=10
Run Code Online (Sandbox Code Playgroud)
实现:在服务器端,我有一个模型绑定器,它接受这3个参数 - api-key,term和rows,并将它们转换为C#对象,这样我的控制器操作方法就不必解析查询字符串了.所以控制器动作方法签名看起来像
public IHttpActionResult Get(RequestObject request)
Run Code Online (Sandbox Code Playgroud)
问题:我在Swagger中遇到的是它生成文档和测试工具时,它将输入参数列为request.api-key,request.term和request.rows.这是因为从服务器获取的JSON是将对象名称添加到这些值的前缀.因此,当您尝试使用Swagger UI执行HTTP GET请求时,它会构建类似的URL
http://fake.api.com/search?request.api-key=1235&request.term=car&request.rows=10
Run Code Online (Sandbox Code Playgroud)
这是对服务器的错误请求.现在我可以轻松地使我的模型绑定器变得更聪明,只是忽略"请求".部分,但这似乎是一个解决这个问题的落后方式.
问题:如何在服务器端自定义由Swashbuckle - > Swagger生成的JSON,以便此特定对象的参数名称不以对象名称为前缀?我确实调查了Swashbuckle可扩展性API公开的ISchemaFilter和IDocumentFilter,但我没有看到一个干净的方法来做到这一点.可能是有可能的,但在这种情况下,一个例子会有所帮助.
找到了一个解决方案,事实证明这是我忽略的一件事-IOperationFilter。有关详细信息,请参见https://github.com/domaindrivendev/Swashbuckle/issues/128。
更新资料
这是注释中提到的解决方案的代码
public class IgnorePrefixParamsNameBeforeDot : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
if (operation.parameters != null)
{
foreach (Parameter param in operation.parameters.Where(p => p.name.Contains('.')))
{
param.name = param.name.SplitWithoutEmpty('.').Last();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)