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

OpenAPI / Swagger-ui:表单中自动生成的JSON忽略参数名

罗和煦
2023-03-14

编辑:在这里发帖后发现了这篇文章,请看下面的回答

我正在使用服务栈及其OpenApi插件。我不确定这是否是一个摇摆用户界面问题,服务栈或我的代码中的某些东西。

我有一个 POST 终结点,我希望在其中填充“客户”属性:

[Route("/api/customers/", "POST", Summary = "Creates a new customer")]
public class CreateCustomer : IReturn<CreateCustomerResponse>
{
    [ApiMember(Description = "The customer data", ParameterType = "body", IsRequired = true)]
    public Customer Customer { get; set; }
}

客户类具有许多属性,如“名字”等。

当我在swagger-ui中查看时,我可以看到“示例值”缺少名称“客户”,而JSON对象“客户”应该放在这个名称中:

如果我按下“尝试一下”按钮,我可以看到Swagger-ui直接发送“客户”对象,而没有指定它应该在“客户”内部(为了清楚起见,我删除了反斜杠,并从客户json中删除了属性):

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{  
   "PopulationRegistryNumber": "string",  
   "Firstname": "string",  
   "MiddleName": "string",  
   "Lastname": "string"
 }

我所期望的是:

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '
{ "Customer": 
   {
       "PopulationRegistryNumber": "string",
       "Firstname": "string",
       "MiddleName": "string",
       "Lastname": "string"
   }
}

现在,如果我删除服务堆栈 ApiMember 属性,则 Swagger-ui 具有正确的 JSON,但它在“客户”表单中添加了一个单独的字段,这是误导性的,不应该存在,因为它应该是正文的一部分。

“客户”字段是一个虚张声势的问题,还是一个服务堆栈问题,还是我遗漏了什么?

共有1个答案

薛弘济
2023-03-14

服务堆栈论坛上有一个帖子,其中讨论了这个确切的问题。

xplicit的最后一篇文章提供了一个解决方案,尽管我不清楚这些属性究竟是如何协同工作的。

部分解决了我的问题的解决方案是:

您可以使用 [ApiMember(排除在化学中=true)] 和 [Apimember(参数类型=“模型”)] 来排除您不希望在开放 API 定义中看到的属性。例如

[Route("/workflow/{ProjectId}", "POST")]
[Api(BodyParameter = GenerateBodyParameter.Always, IsRequired = true)]
public class WorkflowPostRequest : IReturn<Workflow>
{
    [ApiMember(ParameterType = "path", ExcludeInSchema = true)]
    public string ProjectId { get; set; }

    [ApiMember(ParameterType = "model")]
    public Workflow Workflow { get; set; }
} 

将生成以下开放 API 定义:

论坛帖子在这里。

注意:

该类上的属性 [Api(正文参数 = 生成正文参数.始终,需要 = true)],在我的情况下是不需要的,正确的 JSON 和外观无论如何都可以工作。

所以,基本上,你需要做的就是从参数类型=“身体”参数类型=“模型”。

还要注意,path、query等中的变量必须使用< code>ExcludeInSchema手动排除,这很烦人,但也是可行的。

 类似资料:
  • 我正在编写一个OpenAPI规范,并试图从请求路由/路径的注释中自动(使用swagger-php)生成我可能的查询参数。我知道我可以为每个路由键入所有可能的参数选项,但我确实需要能够使用注释从类的属性自动生成可能的参数,就像我可以为请求体所做的那样。(我们将有大量的类/路径,除非它们像请求体/JSONContent那样生成,否则很可能无法保持更新。这在一般的swagger-php甚至OpenAPI

  • 所以我有一个spring boot项目,我刚刚添加了OpenAPI Swigger UI。它可以自动生成所有控制器和模型的文档。但我想添加一些额外的配置,比如这里显示的externalDocs。 但由于它是自动生成的,我没有一个扬眉吐气的YAML。我试图通过一个没有运气的豆子添加以下内容。 下面是我的Pom。xml,如果需要的话。 谢谢你的建议。

  • 如何更改$ref的一部分,或添加到其中? 我有一个OpenAPI 3。x响应机构: 说明性文本适用于我在本文中使用的每个实例,最后一行除外。每种产品都会发生变化,比如产品编号。 也有类似的问题,但关于似乎不适用的模式,anyof运算符也不适用。我猜应该是这样的,但当然,这不起作用,因为$ref不能使用额外的操作。

  • 本文向大家介绍SpringBoot+Swagger-ui自动生成API文档,包括了SpringBoot+Swagger-ui自动生成API文档的使用技巧和注意事项,需要的朋友参考一下 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染、先后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远。 这样后段开发好了api 之后就要提交api 文档给前端的朋友。给前端的a

  • 我正在开发一个Spring Boot应用程序的后端,该应用程序使用OpenAPI和Swagger通过模式为前端应用程序提供接口。yml文件。当对控制器进行更改时,我们使用swagger ui获取api文档JSON,使用在线swagger编辑器将其转换为yaml,并将结果粘贴到模式中。yml文件 现在,我想让它自动化,这样我们就可以调用一个maven任务来自动生成yaml文件,但我找不到任何mave

  • 我有一个Spring Boot应用程序,其中API被指定为OpenAPI 3.0.2 YAML文档。我使用openapi生成器maven插件从规范生成代码http://localhost:8080/swagger-用户界面。html,它显示:“规范中未定义任何操作!” 在规范中,我有: 这导致控制器类中出现以下情况: 如果我加载openapi定义。编辑亚马尔。大摇大摆io,它显示了预期的定义。 如