代码之家  ›  专栏  ›  技术社区  ›  onefootswill

Swagger正在向“试用”功能发送的请求中的URL添加占位符文本。

  •  2
  • onefootswill  · 技术社区  · 6 年前

    我正在为我的WebAPI项目使用Swagger和Swaggerui(通过swashbuckle.aspnetcore nuget包)。

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

    当我单击Execute(执行)时,如果ModifiedSince文本输入中没有值,则点击以下URL https://localhost:44348/v1/conforcement/%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正在访问的控制器操作示例如下:

    摘要 ///用户日志。 ///</summary> ///<param name=“modifiedsince”></param> ///<退货></退货> ///<response code=“200”>分配给用户的日志</response> ///<response code=“204”>没有为用户分配日志</response> ///<response code=“400”>错误状态。有效负载中包含错误消息。</response> ///<response code=“403”>需要身份验证。</response> [httpget] [路线(“[行动]/修改开始?}) [MapToApiVersion(“1.0”)] [产品响应类型(类型(APIResponse<IEnumerable<logbookdto>),200)] [产品响应类型(204)] [产品响应类型(typeof(apiresponse<string>),400)] [产品响应类型(typeof(apiresponse<string>),403)] 公共异步任务<IActionResult>日志(长?修改内容) { var logbookdtos=默认值(IEnumerable<logbookdto>); if(等待authorizeasync(user,identityconstants.policynames.racsuser)&& 等待执行(async()=>logbookdtos=await _mediator.send( 新GetLogbookSquery { userid=_currentuser.userid //lastconfigchange=空 }) ) { if(logbookdtos.any()) 返回OK(新APIResponse<IEnumerable<logbookdto>>data=logbookdtos,outcome=new operationoutcome error=false,message=“”); 返回noContent(); } 返回ErrorResponse(new APIResponse<string>data=errors,outcome=new operationoutcome error=true,message=“”); }
    
    

    下面是chrome dev工具的一张图片,描述正在发生的事情:

    有人知道发生了什么事吗?我有没有漏掉一个配置文件?long在服务器上的方法签名中。该参数被调用modifiedSince.

    当我单击Execute时,如果在ModifiedSince文本输入中没有值,则会命中以下URLhttps://localhost:44348/v1/Complication/%7BmodifiedSince%7D

    它提取占位符文本并将其包含在URL中(在HTML编码的大括号内)。

    https://localhost:44348/v1/Logbook/37193/Entry/2121321

    https://localhost:44348/v1/Logbook/37193/Entry/%7BentryId%7D?entryId=2121321

    /// <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 = "" } });
    }
    

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   Helder Sepulveda    6 年前


    https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/new

    nullable not required


    public async Task<IActionResult> Logbook(long modifiedSince = -1)