domingo, 19 de abril de 2015

Análise do Vídeo Web Api Advanced Design

Segue um post com anotações do vídeo abaixo que dá boas dicas avançadas de Web Api do Channel 9.

Parameter Binding (Vinculo de Parâmetros)

Parametros simples são passados pelaURI (Ou Querystring)

Parâmetros complexos são passados pelo corpo da requisição

É possível mudar esse comportamento definindo FromBody e FromURI nos parâmetros dos métodos de requisição, conforme exemplo:

 public IHttpActionResult PostIt([FromBody]string name, [FromUri]DemoVector vector)  
 {  

Fonte : https://github.com/MicrosoftLearning/WebAPIDesign/blob/master/06%20-%20Advanced%20Design/06aParameterBinding/Controllers/VectorsController.cs

Typer Converters (Conversor de tipo)

Quando existe, trata tipos como simples

É possível criar um convertor explícito

https://github.com/MicrosoftLearning/WebAPIDesign/blob/master/06%20-%20Advanced%20Design/06bTypeConverters/Models/DemoVectorConverter.cs

É possível decorar a classe com o tipo de conversor

Se você não tiver acesso a classe de conversão para decora-la, ainda é possível conforme abaixo:

 public static void Register(HttpConfiguration config)  
 {  
 ...  
   TypeDescriptor.AddAttributes(typeof (DemoVector),   
     new TypeConverterAttribute(typeof (DemoVectorConverter)));  
 }  

Fonte: https://github.com/MicrosoftLearning/WebAPIDesign/blob/master/06%20-%20Advanced%20Design/06bTypeConverters/App_Start/WebApiConfig.cs

Model Binding (Vinculação de Modelo)

Solução mais específica que a conversão de tipo, que permite acesso ao HttpContext

 public IHttpActionResult ModelBinder([ModelBinder(typeof(DemoVectorModelBinder))]DemoVector vector)  

Fonte : https://github.com/MicrosoftLearning/WebAPIDesign/blob/master/06%20-%20Advanced%20Design/06cModelBinders/Controllers/VectorsController.cs

Versioning (Versionamento)

Interessante fazer mesmo se a API é consumida internamente

Não há padrão, mas há várias formas de fazer:

· Colocar a versão como parte do caminho. Exemplo: /api/v1

· Colocar como parâmetro. Exemplo: /api/versions?version=v1

· Definir no parâmetro de cabeçalho “Accept”. Exemplo: application/v1+json

· Definir no cabeçalho de requisição. Exemplo: version 1.0

 [Route("api/things")]  
 [Route("api/v2/things")]  
 public IHttpActionResult GetV2()  
 {  
   return Request.GetVersion().Equals("v1", StringComparison.InvariantCultureIgnoreCase) ?   
     GetV1() : Ok(ThingRepository.Current.GetNew());  
 }  
 [HttpGet]  
 [Route("api/v1/things")]  
 public IHttpActionResult GetV1()  

Fonte: https://github.com/MicrosoftLearning/WebAPIDesign/blob/master/06%20-%20Advanced%20Design/06dVersioning/Controllers/ThingController.cs

No exemplo acima, toda definição de qual método a ser utilizado está ficando definido em cada método. Ainda é possível herdar do DefaultHttpControllerSelector e fazer um versionamento de todo projeto.

Fonte: https://github.com/MicrosoftLearning/WebAPIDesign/blob/master/06%20-%20Advanced%20Design/06dVersioning/Version/VersionControllerSelector.cs

Azure API Services

Prover uma plataforms de gerencimento do Web Api exposto

Referência para mais informações:

http://azure.microsoft.com/en-us/services/api-management/