当前位置: 首页 > 知识库问答 >
问题:

Swagger在ASP。核心3

暨正真
2023-03-14

当从查询字符串提取的模型将字典作为其属性之一时,Swagger生成错误的URL。如何告诉Swagger更改URL中字典的格式或手动定义输入参数模式,而不自动生成?试图使用Swashbuck和NSwag。

控制器

public class RecordsController : ControllerBase
{
  [HttpGet]
  [Route("services/records")]
  public async Task<IActionResult> Records([FromQuery] QueryModel queryModel)
  {
    return null;
  }
}

输入模型-查询字符串

public class QueryModel 
{
  public int Page { get; set; }
  public int Count { get; set; }
  public Dictionary<Columns, string> Conditions { get; set; }
}

Swagger UI为查询模型的“条件”属性显示了这种格式

{
  "UserId": "string",
  "GroupId": "string",
  "RecordId": "string"
}

Swagger生成的URL-Open API v2-将不会绑定到“条件”

/services/records?Page=0&Count=5&Conditions={"UserId":"1"} 

Swagger生成的URL-Open API v3-将不会绑定到“条件”

/services/records?Page=0&Count=5&UserId=1 

自定义URL-按预期工作并使用{"UserId","1"}初始化“条件”

/services/records?Page=0&Count=5&Conditions[UserId]=1 

问题

如何强制Swagger呈现URL,如属性名称[Key]=Value类型字典的属性?

替代问题

这不是一个解决方案,但是如果我以这种方式为输入参数定义默认值,Swagger 将创建正确的 URL。

{
  "Conditions[UserId]": "1",
  "Conditions[GroupId]": "2"
}

URL现在是正确的,并且正确地绑定到模型

/services/records?Page=0&Count=5&Conditions[UserId]=1&Conditions[GroupId]=2 

有没有办法更改显示在Swagger字典输入类型的默认值?

共有1个答案

林建本
2023-03-14

您需要为查询定义设置查询样式深度对象

NSwag目前通过SwaggerParameterStyle支持这一点,您将为其设置值<code>deepObject

我也很好奇在没有NSwag的情况下如何做到这一点,所以我看了看https://editor.swagger.io/

在这里,您可以向它提供您的静态json swagger,如果您想查看创建相同设置的不同方式,它将为您生成一个服务器

字典的示例模型

[DataContract]
public partial class Dictionary : IEquatable<Dictionary>
{ 
    /// <summary>
    /// Gets or Sets Word
    /// </summary>
    [DataMember(Name="word")]
    public string Word { get; set; }

    /// <summary>
    /// Gets or Sets Define
    /// </summary>
    [DataMember(Name="define")]
    public string Define { get; set; }

样本控制器

    /// <summary>
    /// Get word definition
    /// </summary>
    /// <remarks>Get me the word definitions</remarks>
    /// <param name="dictionary">Status values that need to be considered for filter</param>
    /// <response code="200">successful operation</response>
    [HttpGet]
    [Route("/v2/book")]
    [ValidateModelState]
    [SwaggerOperation("BookGet")]
    public virtual IActionResult BookGet([FromQuery][Required()]Dictionary dictionary)

原始 Swagger 示例查询

/book:
  get:
    summary: Get word definition
    description: Get me the word definitions
    parameters:
    - name: dictionary
      in: query
      description: Status values that need to be considered for filter
      required: true
      style: deepObject
      schema:
        type: object
        properties:
          word: 
            type: string
          define:
            type: string

查看中的deepObject样式https://swagger.io/specification/

 类似资料:
  • 我们正在开发具有移动部分和网络用户界面的应用程序。Web UI使用角,我们在后端配置cors时遇到了问题。我们的代码如下(只是对我们的问题很重要的代码): 从stackoverflow上的文档和其他帖子来看,这应该是可行的,但不是。我们错过了什么? thnx 编辑: 这是邮递员的请求: 卷曲'https://guw.azurewebsites.net/api/token'-X OPTIONS-H'

  • 我的问题和这个差不多。 ASP。Net Core与EF Core和CosmosDB-身份问题 提供的答案不起作用。这会产生其他问题。当我从升级我的应用程序时,这些错误开始出现。NET Core 3.1 to。净5。降级应用程序使所有错误都消失了。显然,这个问题与efcore 5中引入的对cosmos的乐观并发支持有关。 https://docs.microsoft.com/en-us/ef/cor

  • 我正在实现确认电子邮件功能。我正在向用户发送一封帐户激活电子邮件,电子邮件中有激活链接。我正在尝试,当用户单击电子邮件中的链接时,它会将用户重定向到我的方法ConfirmEmail之一,该方法采用两个参数user,即加密的电子邮件和代码。当我单击调试器设置为该ConfirmEmail方法的链接时,它不会出现在那里。 确认电子邮件方式: 电子邮件中的链接如下所示: https://localhost

  • 我正在做一个我命名为“主项目”的项目。我至少有10个不同的小项目在那里,这个项目可能会增长。我对所有这些项目只有一个自信,因为所有这些项目都只使用一个dotnet核心web应用程序来进行推广。 例如,假设我有一个名为的项目和一个名为的项目。有三个不同的endpoint,分别名为、、、和。这两个不同的项目将出现在一个大摇大摆的UI中,如下所示: 我想做的是在一个dotnet核心web项目中设置多个不

  • 我正在使用Swagger和泽西岛1。它生成斯瓦格规格 v1.2 中的规范。大多数工具(例如编辑器)都需要规范v2.0。有没有办法生成规范v2.0? 我实际上想要像bootprint swagger这样的可打印/静态文档,这也需要规范v2.0。

  • 我正在尝试使用我的沙盒模式通过PayPal运行付款。NET CORE 3项目。这个想法是让客户能够选择是使用他/她的PayPal账户还是信用卡付款。我正在使用PayPal-NET-SDKv2.0.0-rc2 我正在努力理解这是否是正确的运行顺序: 使用 这是正确的执行命令吗?