可选的WebAPI路由参数和Swagger文档

wj8zmpe1  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(161)

我有一个WebAPI方法,在属性中定义了路由,有一个强制参数和一个可选参数:

[HttpGet]
    [Route("api/ChargeCard/{cif}/{feeScheme=null}")]
    [ResponseType(typeof(ChargeCardRoot))]
    public IHttpActionResult Get(string cif, string feeScheme, ChargeCardRequestMode mode = ChargeCardRequestMode.Basic)
    {

我也使用Swashbuckle / Swagger来生成文档。问题是Swagger总是将我的可选参数标记为必需的。
将可选参数表示法更改为:

[Route("api/ChargeCard/{cif}/{feeScheme?}")]

使这两个参数看起来都是必需的,但也不会使Swagger将其显示为可选的。
有没有办法用Swagger为可选参数生成正确的文档?

fnvucqvd

fnvucqvd1#

如果你重载了你的方法,Swashbuckle会生成两个不同的Swagger端点。一个方法有参数,另一个没有,并调用第一个方法的默认值为“missing”参数。这也有一个好处,如果你使用类似HyprLinkr的东西来生成HATEOAS链接,这会更容易,因为你不能在表达式中有可选参数。

[HttpGet]
[Route("api/ChargeCard/{cif}/{feeScheme}")]
[ResponseType(typeof(ChargeCardRoot))]
public IHttpActionResult Get(string cif, string feeScheme, ChargeCardRequestMode mode = ChargeCardRequestMode.Basic)
{
    // working code
}

[HttpGet]
[Route("api/ChargeCard/{cif}")]
[ResponseType(typeof(ChargeCardRoot))]
public IHttpActionResult Get(string cif, string feeScheme)
{
    return Get(cif, feeScheme, ChargeRequestMode.Basic);
}

希望能有所帮助。

63lcw9qa

63lcw9qa2#

就Swagger而言,您可以指定可选参数,方法是从路由中省略它们,并在方法签名中为参数声明指定“string?”,如下所示:

[HttpGet]
[Route("api/ChargeCard/{cif}")]
[ResponseType(typeof(ChargeCardRoot))]
public IHttpActionResult Get(string cif, string? feeScheme)
{
    ...
}

但是请注意,这些参数将不再作为路由的一部分进行传递。可选参数将作为附加到路由的查询参数进行传递,如下所示:

https://somedomain.com/api/ChargeCard/{cif}?feeScheme=ABCD

如果您采用这种方法,还需要将此行添加到文件的顶部,以防止Visual Studio移除“?”并将其替换为[CanBeNull]属性:


# nullable enable

相关问题