Swagger считает, что полезная нагрузка исходит от «запроса» - PullRequest
0 голосов
/ 14 января 2019

У меня есть основной проект aspnet с простым REST API.

NSwag используется как инструмент Swagger, и он работает на основе украшений, которые я наложил на модели и методы контроллера:

[Route("api/v2/")]
public class JobCollectionsControllerV2 : Controller
{
    [HttpPut]
    [Route("tenants/{tenant}/collections/{collection}")]
    [SwaggerResponse(typeof(JobCollectionDtoV2))]
    public async Task<IActionResult> CreateTask(JobCollectionDtoV2 collectionParams)
    {
        // removed
    }
}

public class JobCollectionDtoV2
{
    [Required]
    [FromRoute]
    [RegularExpression("^[a-z][a-z0-9]+$")]
    [StringLength(maximumLength: 24, MinimumLength = 3)]
    public string Collection { get; set; }

    [Required]
    [FromRoute]
    [RegularExpression("^[a-z][a-z0-9]+$")]
    [StringLength(maximumLength: 24, MinimumLength = 3)]
    public string Tenant { get; set; }

    [Required]
    [FromBody]
    public JobCollectionDetails CollectionDetails { get; set; }

    public override string ToString()
    {
        return JsonConvert.SerializeObject(this);
    }
}

public class JobCollectionDetails
{
    [Required]
    public bool Enabled { get; set; }

    [Required]
    [CollectionFrequency]
    public TimeSpan Frequency { get; set; }
}

Приведенный выше код заставляет NSwag сгенерировать следующий файл Swagger:

{
    "put": {
        "tags": [
            "JobCollectionsControllerV2"
        ],
        "operationId": "JobCollectionsControllerV2_CreateTask",
        "parameters": [
            {
                "type": "string",
                "name": "collection",
                "in": "path",
                "required": true,
                "maxLength": 24,
                "minLength": 3,
                "pattern": "^[a-z][a-z0-9]+$",
                "x-nullable": false
            },
            {
                "type": "string",
                "name": "tenant",
                "in": "path",
                "required": true,
                "maxLength": 24,
                "minLength": 3,
                "pattern": "^[a-z][a-z0-9]+$",
                "x-nullable": false
            },
            {
                "type": "object",
                "name": "collectionDetails",
                "in": "query",
                "required": true,
                "x-schema": {
                    "$ref": "#/definitions/JobCollectionDetails"
                },
                "x-nullable": true
            }
        ],
        "responses": {
            "200": {
                "x-nullable": true,
                "description": "",
                "schema": {
                    "$ref": "#/definitions/JobCollectionDtoV2"
                }
            }
        }
    }
}

Отлично выглядит, за исключением следующей части , которая указывает, что collectionDetails должен исходить из параметров запроса, а не из тела.

            {
                "type": "object",
                "name": "collectionDetails",
                "in": "query",  <<<<-------------- SHOULD BE 'body' or something like that
                "required": true,
                "x-schema": {
                    "$ref": "#/definitions/JobCollectionDetails"
                },
                "x-nullable": true
            }

Я не уверен, как я могу это исправить - я очень ценю вашу помощь в этом.

Спасибо!

РЕДАКТИРОВАТЬ # 1 (инициализация NSwag):

    public void ConfigureServices(IServiceCollection services)
    {
        if (_env.IsDevelopment())
        {
            services.AddMvc();
            services.AddSwaggerDocument();
        }
    }


    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            _loggerFactory.AddDebug();
            app.UseDeveloperExceptionPage();

            app.UseSwagger(settings =>
            {
                settings.PostProcess = (document, request) =>
                {
                    document.Info.Version = _context.CodePackageActivationContext.CodePackageVersion;
                    document.Info.TermsOfService = "None";
                    document.Info.Contact = new SwaggerContact
                    {
                    };
                };
            });

            app.UseSwaggerUi3();
        }
    }

1 Ответ

0 голосов
/ 14 января 2019

Я обновил библиотеки NSwag до последней версии v12 (начиная с версии v11), и проблема была решена - query действительно был заменен на body

Других изменений не было.

...