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

导入OpenAPI2.0Postman collection和所有POST请求正文显示为x-www-form-urlencoded,而不是原始JSON

湛钊
2023-03-14

.NET Framework 4.8
Postman Version7.19.1
Swashbuckle 5.6.0,nugget包

我有一个使用Swagger(Swashbuckle)的大API,我想将开放的API模式作为一个集合导入到Postman中。
在继续{myUrl}/swager/docs/v1并将模式粘贴到Postman中后,我注意到我的所有Post请求都“中断”了。当转到正文时,它显示为“application/x-www-form-urlencoded”,而不是原始的JSON正文。

相反,它看起来是这样的:

{
    "swagger": "2.0",
    "info": {
        "version": "v1",
        "title": "My API"
    },
    "host": "localhost:51209",
    "schemes": [
        "http"
    ],
    "paths": { },
    "definitions": { }
}

路径定义不是空的,它们包含大量API调用,这就是为什么我将从它们中选择一个POST方法,因为它们都有相同的问题。

下面是paths对象和属性“consumes”的一个示例:

"/api/MyController/MyMethod": {
        "consumes": [
            "application/json",
            "text/json",
            "application/xml",
            "text/xml",
            "application/x-www-form-urlencoded"
        ]
}

问题似乎出在consumes对象属性中,该属性有一个字符串数组作为值,其中一个字符串是“application/x-www-form-urlencoded”

[HttpPost]
[Route("MyMethod")]
public IHttpActionResult MyMethod(List<JobHeaderInputModel> jobHeaderList)

共有1个答案

孔乐邦
2023-03-14

我看到了这篇令人惊叹的文章,并在那里实现了解决方案:

创建了自定义属性:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class SwaggerConsumesAttribute : Attribute
{
    public SwaggerConsumesAttribute(params string[] contentTypes)
    {
        this.ContentTypes = contentTypes;
    }

    public IEnumerable<string> ContentTypes { get; }
}

之后,为Swagger创建OperationFilter类:

public class ConsumesOperationFilter : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        var attribute = apiDescription.GetControllerAndActionAttributes<SwaggerConsumesAttribute>().SingleOrDefault();
        if (attribute == null)
        {
            return;
        }

        operation.consumes.Clear();
        operation.consumes = attribute.ContentTypes.ToList();
    }
}
c.OperationFilter<ConsumesOperationFilter>();
 类似资料: