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) [HttpGet] |
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:
NET - Unit of Work - Padrão Unidade de ...