Типы содержимого ответа в swagger, .net core api - PullRequest
0 голосов
/ 27 декабря 2018

У меня были некоторые проблемы с отображением моего ответа API в формате xml в swagger, наконец-то я получил его для отображения в правильном формате application / xml с моим первым действием, приведенным ниже, но он по-прежнему говорит, что я могу отобразить его только как application / json,

Я пытался удалить application / json из атрибута Produces, но по-прежнему показывает только application / json.

Есть идеи, почему он так себя ведет?

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().AddMvcOptions(o => o.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter()));
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
        c.RoutePrefix = "";
    });
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
        c.AddSecurityDefinition("Bearer", new ApiKeyScheme { In = "header", Description = "Please enter JWT with Bearer into field", Name = "Authorization", Type = "apiKey" });
        c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>> {
            { "Bearer", Enumerable.Empty<string>() },
        });
    });
}

И действие:

[Produces("application/json", "application/xml")]
public ContentResult GetByAddress(string address)
{
    var addressId = GetAddressIdByAddress(address);
    string result = _soapApi.GetResultById(addressId);
    return Content(result, "application/xml", Encoding.UTF8);
}

Тот же результат с:

[Produces("application/json", "application/xml")]
public IActionResult GetByAddress(string address)
{
    var addressId = GetAddressIdByAddress(address);
    string result = _soapApi.GetResultById(addressId);
    return Content(result, "application/xml", Encoding.UTF8);
}

Результатыв:

Results in this При нажатии на кнопку Excute я получаю результат в правильном формате XML.

При этом:

[Produces("application/json", "application/xml")]
public string GetByAddress(string address)
{
    var addressId = GetAddressIdByAddress(address);
    string result = _soapApi.GetResultById(addressId);
    return result;
}

Или это:

[Produces("application/json", "application/xml")]
public List<Address> GetByAddreses()
{
    string result = _soapApi.GetResults();
    return result;
}

Результаты:

enter image description here

Я не могу вернуть список проанализированных объектов из-за различныхструктура данных возвращается для разных параметров.Таким образом, на данный момент я получаю только необработанные XML-данные мыла и должен анализировать / десериализовать их.Но для того, чтобы на самом деле видеть необработанный ответ, мне также нужно показать его как Content from string с application-type application / xml.И это дает мне хороший вывод вроде (хотя он все еще говорит, что возможно только application / json):

enter image description here

Подводя итог:

У меня не получилось работать с типом содержимого ответа, показывающим правильный тип содержимого (в фильтре "Тип содержимого ответа"), когда строка была проанализирована в ее фактическом формате, как показано ниже.Даже при том, что это приводит к правильному выводу для application / xml, который был самым важным (см. Скриншот выше);

[Produces("application/json", "application/xml")]
public ContentResult GetByAddress(string address)
{
    return Content("<xml>...</xml>", "application/xml", Encoding.UTF8);
} 

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018
[Produces("application/json", "application/xml")]
public Task<IActionResult> GetByAddreses()
{
    var result = _soapApi.GetResults();
var response = ResponceMethod<List<Address>>.SuccessResponse(StatusCodes.Status200OK, "Success", result);
    return Ok(response);
}
0 голосов
/ 28 мая 2019

Я тестирую приложение веб-API, разработанное с помощью asp.net core2.2.

Я установил пакет Microsoft.AspNetCore.Mvc.Formatters.Xml nuget.

Then I updated the **ConfigureServices** method within the Startup.cs by adding.
services.AddMvc().AddXmlSerializerFormatters();

И мой web api swagger работает так, как мне нужно, с выпадающим списком, показывающим оба (json и xml), и в результате получается ожидаемый формат.Если вам нужна дополнительная информация, пожалуйста, посетите: https://docs.microsoft.com/en-us/aspnet/core/web-api/advanced/formatting?view=aspnetcore-2.1

0 голосов
/ 27 декабря 2018

Это потому, что тип возврата переопределяет аннотации.Чтобы заставить его работать так, как вы хотите, вам нужно вернуть IActionResult и использовать аннотации, чтобы указать, какая модель типа ответа должна быть для конкретного кода.
Поэтому вместо возврата result, верните Ok(result)

Iсоздал образец кода, и он работает для меня, используя swagger 4.0.1

[HttpGet("Get2")]
[Produces("application/json", "application/xml", Type = typeof(List<string>))]
public IActionResult Get2()
{
   var list = new List<string>() { "value1", "value2" };
   return Ok(list);
}

swagger output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...