ASP.NET Web API – Content Negotiation

Conneg.

Sua RFC (W3C RFC 2616) o define como:
O meio de selecionar a melhor representação para uma resposta dentre as disponíveis.

É o meio utilizado para determinar, baseado no request do cliente, qual será a formatação da resposta ao mesmo.

É mantido em GlobalConfiguration.Services [.GetContentNegotiation()]. E seus formatadores pertencem ao GlobalConfigration.Formatters. Vale lembrar que são acessíveis de qualquer parte do contexto da sua aplicação.

Por padrão, são disponibilizados quatro formatadores, na seguinte ordem:
1) JsonMediaTypeFormatter;
2) XmlMediaTypeFormatter;
3) FormUrlEncodedMediaTypeFormatter
4) JQueryMvcFormUrlEncodedFormatter.

Também por padrão, os critérios para escolha dentre os formatadores, são na seguinte ordem:
1) MediaType [QueryStringMapping; UriPathExtensionMapping; RequestHeaderMapping; MediaRangeMapping};
2) Accept (http request header), ex.: “Accept: application/json”;
3) Content-Type (http request), ex.: “Content-Type: application/json”;
4) Caso nenhum das alternativas anteriores seja válida para o request, os formatadores mantidos em GlobalConfiguration.Formatters são testados, na ordem que eles são mantidos, checando seu return type.

Caso o contexto de sua aplicação permita, é interessante e tranquilamente possível, substituir o conneg padrão de sua web api por um mais performático. Sim! Tunning!

Por exemplo, se fora definido que o contexto de determinado micro serviço será único e exclusivo json, podemos retirar de nossa api a complexidade na defição do response de cada request, substituindo o conneg padrão por um que não teste nada, apenas retorne “application.json”.

Mãos à obra!

public class JsonContentNegotiator : IContentNegotiator
{
private readonly JsonMediaTypeFormatter _jsonFormatter;

public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
{
_jsonFormatter = formatter;
}

public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable formatters)
{
var result = new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
return result;
}
}

Em seguida, em nosso App_Start:

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(new JsonMediaTypeFormatter()));
...
}
}

P.S.:
Reparem que é uma solução mais elegante que apagar todos os formatters e continuar contando como conneg para nos explicitar um json, ao invez de um xml, como vemos por aí… Rsrs!

[]’s

Referências bibliográficas:

https://www.strathweb.com/2013/06/supporting-only-json-in-asp-net-web-api-the-right-way/
https://www.strathweb.com/2012/07/everything-you-want-to-know-about-asp-net-web-api-content-negotation/

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s