Desativando o uso de XML em serviços Web API

Voltado ao desenvolvimento de serviços em conformidade com a arquitetura REST, o ASP.NET Web API suporta por default JSON e XML como formatos de representação de dados. Do ponto de vista prático, esta característica dispensa os desenvolvedores da necessidade de configurar um Web Service para prever estes padrões, algo que não aconteceria ao se implementar este tipo de construção com a tecnologia WCF (ao se empregar JSON uma série de configurações adicionais seriam necessárias, a fim de que um serviço fosse capaz de se adequar a este formato).

Apesar desta capacidade de suportar nativamente JSON e XML na manipulação de informações, haverá situações nas quais apenas uma destas alternativas deverá estar ativa para o consumo de um determinado serviço. Dentre as prováveis razões para isto podem estar requisitos não-funcionais (como a obrigatoriedade em se utilizar JSON, por exemplo) ou, até mesmo, a forma como um Web Service foi implementado (como ao se optar pelo uso de tipos anônimos para devolver dados, em que se torna impossível a geração de um retorno no formato XML).

Considerando especificamente a utilização de tipos anônimos em Web API, publiquei anteriormente dois artigos em que abordo a utilização destas estruturas:

– Utilizando tipos anônimos no ASP.NET Web API
http://www.tiselvagem.com.br/geral/tipos-anonimos-asp-net-web-api/

– Mensagens de erro customizadas no ASP.NET Web API
http://www.tiselvagem.com.br/geral/mensagens-de-erro-servicos-web-api/

Conforme já discutido no primeiro destes artigos, a tentativa de envio de uma requisição ao Web Service para consumir dados em XML levará a um erro. É o que se observa durante o acesso a este serviço via Google Chrome, (como indicado na Imagem 1). Para este teste foi utilizada a seguinte URL:

http://localhost:54883/api/conversortemperatura?grauscelsius=0

Imagem 1. Erro ao se consumir o serviço de testes no formato XML

Imagem 1. Erro ao se consumir o serviço de testes no formato XML

A solução para este tipo de questão envolve a realização de ajustes na classe WebApiConfig do projeto TesteWebAPI.TiposAnonimos (Listagem 1). Neste tipo está definido o método Register, o qual recebe como parâmetro uma instância da classe HttpConfiguration (namespace System.Web.Http). É a partir desta referência (chamada aqui de “config”) que detalhes da configuração de um serviço Web API podem ser modificados:
– Uma instancia do tipo HttpConfiguration conta com as propriedades XmlFormatter e JsonFormatter. A estas duas estruturas estão vinculados objetos empregados em operações de serialização nos formatos XML e JSON, respectivamente;
– Para que o uso de XML seja desativado em um serviço Web API, o objeto vinculado à propriedade XmlFormatter deverá ser removido da lista de formatos associados à propriedade Formatters do parâmetro “config”.

Listagem 1: Desativando o uso de XML na classe WebApiConfig

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace TesteWebAPI.TiposAnonimos
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.Formatters.Remove(
                config.Formatters.XmlFormatter);
        }
    }
}

Após uma nova tentativa de acesso ao serviço de conversão de temperaturas, serão retornados desta vez dados no formato JSON (sem a ocorrência de erros). O resultado deste teste está demonstrado a Imagem 2.

Imagem 2. Dados no formato JSON após ajuste do Web Service de testes

Imagem 2. Dados no formato JSON após ajuste do Web Service de testes


Conclusão

Procurei demonstrar com este post a geração de respostas em XML em serviços Web API pode ser desativada. É possível repetir esse mesmo tipo de procedimento sem maiores dificuldades, caso a intenção esteja em desabilitar o uso de JSON em Web Services criados com este framework.

O download da solução de exemplo pode ser efetuado através do seguinte link:

https://github.com/renatogroffe/TesteWebAPI-TiposAnonimos

Espero que o conteúdo aqui apresentado possa ser útil.

Até uma próxima oportunidade!

Renato Groffe – Consultor em TI, MCTS
http://rgroffe.wordpress.com/


Referências

Anonymous Types (C# Programming Guide)
http://msdn.microsoft.com/en-us/library/vstudio/bb397696(v=vs.120).aspx

Comentarios

comentarios