Задать вопрос
@mkd_2128506
C# full-stack developer (middle)

ASP.Net Core: Почему SwaggerUI подставляет имя переменной в URL, а не значение?

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddCors();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddControllers();

//builder.Services.Configure ...
//builder.Services.AddTransient ...

builder.Logging.ClearProviders();
builder.Services.AddLogging();
builder.Host.UseNLog();


builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v2", new OpenApiInfo
    {
        Version = "v2",
        Title = "Company.IntegrationWebApi",
        Description = "Company: Интеграция"
    });
    options.EnableAnnotations();
    var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
}
);
var app = builder.Build();

app.UseStaticFiles();
app.UseSwagger(
    opt => {
        opt.SerializeAsV2 = true;
    }
    );
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("../swagger/v2/swagger.json", "Company.IntegrationWebApi");
    c.RoutePrefix = "swagger";
    
});
app.UseAuthorization();
app.MapDefaultControllerRoute();
app.MapGet("/", () => "Company.IntegrationWebApi");
app.MapControllers();

app.Run();


Код контроллера. Проблема наблюдается на всех методах
// <summary>
        /// Получить данные о клиенте по номеру телефона.
        /// </summary>
        /// <param name="phoneNumber_">Номер телефона клиента. Формат: 11 цифр, первая цирфа - 7 </param>
        /// <returns></returns>
        [HttpGet("ClientData/phoneNumber={phoneNumber_}")]
        [Produces("application/json")]
        [ProducesResponseType(typeof(CompanyClientByPhoneResponse), (int)HttpStatusCode.OK)]
        [SwaggerResponse((int)HttpStatusCode.BadRequest, "Запрос сформирован некорректно(например формат телефона)")]
        [SwaggerResponse((int)HttpStatusCode.InternalServerError, "Внутренняя ошибка")]
        [SwaggerResponse((int)HttpStatusCode.NoContent, "Клиент не найден")]
        public IActionResult ClientDataByANI(string phoneNumber_)
        {
//..
        }

Либы и версии:
<ItemGroup>
    <PackageReference Include="NLog" Version="5.4.0" />
    <PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
    <PackageReference Include="NLog.Targets.GraylogHttp" Version="2.0.1" />
    <PackageReference Include="NLog.Web.AspNetCore" Version="5.4.0" />
    <PackageReference Include="Swashbuckle" Version="5.6.0" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.0" />
    <PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="8.1.0" />
    <PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="8.1.0" />
    <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="8.1.0" />
    <PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="8.1.0" />
  </ItemGroup>


И собственно, возвращается следующая ошибка, при попытке передать номер телефона
67ec33589329f930540606.jpeg
Приложение - .Net 8.0
При этом к EndPoint'у через браузер обращения идут нормально. Именно SwaggerUI почему-то не может корректно передать значение. А передаёт шаблон {phoneNumber_}
Кто опытный, подскажите, почему swaggerUI чудит
  • Вопрос задан
  • 44 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
В случае с HttpGet виноват не swagger, а собственно ты.
Читай, какой синтаксис у шаблонов:
https://learn.microsoft.com/en-us/aspnet/core/mvc/...

Вероятно, тебе нужно телефон не из маршрута получать, а из query.
Знаки = в маршруте - это как-то очень странно, никто так не делает.
[SwaggerResponse((int)HttpStatusCode.NoContent, "Клиент не найден")]

Кажется, тебе тут нужен 404 not found, а не 204 no content.

А в ответе тебе swagger показал собственно то, что вернул твой метод.
Смотри снова в код, видимо ты где-то внутри $ забыл.
Ответ написан
Комментировать
@mkd_2128506 Автор вопроса
C# full-stack developer (middle)
1) Вообще, знак = убрал и всё заработало
2) Если набросать hello, World api-проект на 6.0/8.0, то проблем нет даже со знаком =. Видимо в действующем приложении что-то упустил. Не могу понять что
3) Напомню, что через браузер в URL знак = нормально передаётся. Почему-то SwaggerUI это не нравится. Наверняка что-то с либами и версиями. В коде $ не забыл. Обработчик ошибок нормально сработал.
На скрине SwaggerUI curl в качестве значения передаёт {phoneNumber_}
Хотелось бы глубже понять проблему)
4) Про роутинг почитаю позже

67ecdcadbdc51463907679.png

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{


    [HttpGet("Test/phoneNumber={phoneNumber_}")]
    public string Get(string phoneNumber_)
    {
        return phoneNumber_;
    }
}


var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();

app.MapControllers();

app.Run();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы