Swagger正在将“试用”功能发送的请求中的占位符文本添加到网址中

时间:2018-07-09 04:05:23

标签: swagger swagger-ui swashbuckle

我将Swagger和SwaggerUi(通过Swashbuckle.AspNetCore Nuget包)用于我的WebAPI项目。

我遇到的问题是用户界面没有正确地形成对“试用”功能的请求。例如,我的API在服务器的方法签名中具有可为空的long。该参数称为modifiedSince

当我单击执行时,在modifiedSince文本输入中没有任何值时,将击中以下Url https://localhost:44348/v1/Complication/%7BmodifiedSince%7D

它将获取占位符文本,并将其包含在URL中(在html编码的花括号内)。

在另一个端点上,我有两个参数,URL的含义如下:https://localhost:44348/v1/Logbook/37193/Entry/2121321

但是,当我单击“试用”按钮时,SwaggerUi发送https://localhost:44348/v1/Logbook/37193/Entry/%7BentryId%7D?entryId=2121321,结果,服务器的方法中的entryId参数为空值。

同样,相关文本输入的占位符被添加到url中。

为了解决该问题,我从2.5.0升级到3.0.0。但它仍在发生。

Swagger API击中的Controller动作示例为:

/// <summary>
/// Logbooks of user.
/// </summary>
/// <param name="modifiedSince"></param>
/// <returns></returns>
/// <response code="200">Logbooks assigned to the user</response>
/// <response code="204">No logbooks assigned to the user</response>
/// <response code="400">Error state. Error message included in payload.</response>        
/// <response code="403">Authentication required.</response>        
[HttpGet]
[Route("[action]/{modifiedSince?}")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(ApiResponse<IEnumerable<LogbookDto>>), 200)]
[ProducesResponseType(204)]
[ProducesResponseType(typeof(ApiResponse<string>), 400)]
[ProducesResponseType(typeof(ApiResponse<string>), 403)]
public async Task<IActionResult> Logbook(long? modifiedSince)
{
    var logbookDtos = default(IEnumerable<LogbookDto>);

    if (await AuthorizeAsync(User, IdentityConstants.PolicyNames.RacsUser) &&
        await Execute(async () => logbookDtos = await _mediator.Send(
            new GetLogbooksQuery
            {
                UserId = _currentUser.UserId
                //LastConfigChange = NULL
            }))
            )
    {
        if (logbookDtos.Any())
            return Ok(new ApiResponse<IEnumerable<LogbookDto>> { Data = logbookDtos, Outcome = new OperationOutcome { Error = false, Message = "" } });

        return NoContent();
    }

    return ErrorResponse(new ApiResponse<string> { Data = Errors, Outcome = new OperationOutcome { Error = true, Message = "" } });
}

以下是Chrome开发人员工具中的图片,用于描述正在发生的事情:

enter image description here

有人知道发生了什么吗?我是否错过了某个地方的配置?

1 个答案:

答案 0 :(得分:2)

从评论中展开:

如果在删除指向swashbuckle中的错误的可空值时有效,则应报告:
https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/new

我有点不明白的是,从JSON模式的角度来看,nullable不一定意味着not required ...
 您可以具有必填字段,并允许将null作为值

C#所做的某些事情不会直接转换为大张旗鼓,我建议删除可为空的内容,也许您可​​以使用默认值,例如:
public async Task<IActionResult> Logbook(long modifiedSince = -1)

并处理代码中的默认情况