ASP.NET Core - Usando o formato XML


  Hoje veremos como tratar os dados usando o formato XML em aplicações  ASP.NET Core.

Atualmente a troca de informações na maioria das aplicações Web utiliza o formato JSON. No entanto pode haver cenários onde teremos que usar o formato XML.

Neste artigo veremos como usar configurar uma aplicação ASP .NET Core para usar o formato XML.

Vamos criar uma aplicação Web API chamada ApiFormatoXml usando o VS 2022 no ambiente do .NET 7.0 para ilustrar como fazer isso. Para simplificar o exemplo não irei usar um banco de dados nem vou fazer a integração com o Swagger.

No projeto vamos criar as pastas Entities e Services e na pasta Entities vamos criar a classe Produto contendo as seguintes propriedades:

public class Produto
{
 
public string? Codigo { get; set; }
 
public string? Nome { get; set; }
 
public int Estoque { get; set; }
  public decimal Preco { get; set; }
}

A seguir na pasta Services vamos criar a interface IProdutoService e a classe concreta ProdutoService onde vamos definir e implementar o serviço que vai gerar os dados que iremos exibir na aplicação.

1- IProdutoService

public interface IProdutoService
{
  List<Produto> GetProdutos();
}

2- ProdutoService

using ApiFormatoXml.Entities;

namespace ApiFormatoXml.Services;

public class ProdutoService : IProdutoService
{

   public List<Produto> GetProdutos()
   {
       List<Produto> produtos =
new List<Produto>();

       produtos.Add(
new Produto() { Codigo = "P001", Nome = "Produto 1",
Estoque = 10,Preco = 5 });

       produtos.Add( new Produto() { Codigo = "P002", Nome = "Produto 2",
Estoque = 15, Preco = 7 });

       produtos.Add( new Produto() { Codigo = "P003", Nome = "Produto 3",
Estoque = 18, Preco = 8 });

       produtos.Add( new Produto() { Codigo = "P004", Nome = "Produto 4",
Estoque = 17, Preco = 3 });

       return
produtos;
    }
}

Na classe Program vamos incluir o serviço no container DI :

...
builder.Services.AddScoped<IProdutoService,ProdutoService>();
...

Agora na pasta Controllers crie o controlador ProdutosController :

[Route("api/[controller]")]
[ApiController]

public
class ProdutosController : ControllerBase
{
  
private readonly IProdutoService _produtoService;

   public ProdutosController(IProdutoService produtoService)
   {
     _produtoService = produtoService;
   }

   [HttpGet]
  
public ActionResult<List<Produto>> Get()
   {
    
var produtos = _produtoService.GetProdutos();
    
if (produtos == null)
     {
       
return BadRequest();
     }
    
return Ok(produtos);
   }
}

Neste momento ao executar o projeto iremos obter os dados no formato JSON:



Usando o Postman também vamos obter os dados no formato JSON:

Mesmo se alterarmos no Postman as propriedades Content-Type e Accept para application/xml continuaremos a receber os dados no formato JSON:

Isso acontece porque não informamos ao ASP.NET Core que também queremos retornar dados XML. Para fazer isso podemos definir no arquivo Program o seguinte código:


...
builder.Services.AddControllers().AddXmlSerializerFormatters();
...

A seguir no endpoint Get de ProdutosController vamos incluir o atributo: [Produces("application/xml")]

[HttpGet]
[Produces(
"application/xml")]
public ActionResult<List<Produto>> Get()
{
  ...
}

Com isso agora obtemos os dados no formato XML:

Se você deseja tornar o XML o formato padrão para várias Actions, vai precisar decorar todas elas com o atributo [Produces("application/xml")].  Para tornar o formato XML padrão para todo o aplicativo podemos definir a seguinte configuração na classe Program:

...
builder.Services.AddMvc(options =>
{
   options.Filters.Add(
new ProducesAttribute("application/xml"));
})
.AddXmlDataContractSerializerFormatters();
...

Com isso , estamos adicionando o filtro global ProducesAttribute e agora não precisamos decorar as Actions individuais com o atributo [Produces] e ainda vamos obter o XML na resposta.

Pegue o projeto aqui: ApiFormatoXml.zip ...

"O meu mandamento é este: Que vos ameis uns aos outros, assim como eu vos amei."
João 15:12

Referências:


José Carlos Macoratti