Можно ли добавить проверки параметров для переменных пути в приложении API dontnetcore? - PullRequest
0 голосов
/ 10 марта 2020

с учетом метода:

/// <param name="containername">The container the file resides in.</param>
/// <param name="fileName">The name of the file to get.</param>
/// <returns>The file specified.</returns>
[HttpGet("{containername}/contentfiles/{fileName}", Name = "Get")]
[ProducesResponseType(typeof(FileResult), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status503ServiceUnavailable)]
public ActionResult Get(string containername, string fileName)

Я проверяю, что имя контейнера и имя файла действительны для моих целей, а затем получаю данные.

Swagger автоматически дает мне * требуется , но не минимальную длину и максимальную длину, что имеет смысл, потому что он не знает, где их найти.

Я надеялся, что я может сделать что-то вроде:

/// <param name="containername" minimum="3" maximum="63">The container the file resides in.</param>

, но это просто отбрасывает их. Как я могу добавить их в мои автоматически сгенерированные документы на сваггеры (в случае необходимости я использую swashbuckle)?

1 Ответ

2 голосов
/ 10 марта 2020

Я создал пример проекта с использованием ASP. NET Core 3.1 Api project.

Сначала давайте посмотрим на контроллер и заметим атрибут ApiController, а также заметим атрибут FromRoute:

    using Microsoft.AspNetCore.Mvc;
    using System.ComponentModel.DataAnnotations;

    namespace ValidationExampleApi.Controllers
    {
      [ApiController]
      [Route("[controller]")]
      public class ValidationController : ControllerBase
      {
        [HttpGet("{containername}/contentfiles/{fileName}")]
        public bool Get([FromRoute]RequestModel request)//it will return 400 bad request if validation fails
        {
          if(ModelState.IsValid)//please note in this case this line will never be hit.
          {
            return false;
          }
          else
          {
            return true;
          }
        }
      }

    }

Теперь давайте посмотрим на модель и заметим аннотации данных с некоторыми техническими характеристиками проверки:

    using Microsoft.AspNetCore.Mvc;
    using System.ComponentModel.DataAnnotations;

    namespace ValidationExampleApi.Controllers
    { 
      public class RequestModel
      {
        [Required(AllowEmptyStrings = false)]
        [StringLength(5, MinimumLength = 2)]
        public string containername { get; set; }

        [Required(AllowEmptyStrings = false)]
        [StringLength(5, MinimumLength = 2)]
        public string fileName { get; set; }
      }
    }

Теперь давайте посмотрим на мой класс запуска и заметим, что я добавил стандартную конфигурацию swashbuckle по умолчанию:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;

namespace ValidationExampleApi
{
  public class Startup
  {
    public Startup(IConfiguration configuration)
    {
      Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
      services.AddControllers();
      services.AddSwaggerGen(c =>
      {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
      });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if(env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }

      // Enable middleware to serve generated Swagger as a JSON endpoint.
      app.UseSwagger();

      // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
      // specifying the Swagger JSON endpoint.
      app.UseSwaggerUI(c =>
      {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
        c.RoutePrefix = string.Empty;
      });

      app.UseRouting();

      app.UseAuthorization();

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapControllers();
      });
    }
  }
}

Теперь посмотрите на мое чванство, как оно показывает, что я нарушаю максимальную длину:

enter image description here

Заключительные примечания:

Вы также можете комбинировать параметры маршрута с параметрами запроса. Вы также можете применить атрибут «FromRoute» на уровне свойств в вашей модели. Есть много способов сделать это. Это просто пример «начала работы».

Настройка ответа об ошибке:

Здесь вы можете увидеть, как использовать обработчик ошибок, а также InvalidModelStateFactory и ValidationProblemDetails: Обработка ошибок Custom

Вот еще один пример использования InvalidModelStateFactory: Другой пример настройки ошибки

...