{"id":521,"date":"2017-04-12T18:39:56","date_gmt":"2017-04-12T21:39:56","guid":{"rendered":"http:\/\/gianfratti.com\/?p=521"},"modified":"2017-04-12T18:47:28","modified_gmt":"2017-04-12T21:47:28","slug":"comprimindo-a-resposta-de-uma-webapi-ativando-a-compactacao-gzip","status":"publish","type":"post","link":"https:\/\/gianfratti.com\/index.php\/comprimindo-a-resposta-de-uma-webapi-ativando-a-compactacao-gzip\/","title":{"rendered":"Comprimindo a resposta de uma WebApi ativando a compacta\u00e7\u00e3o GZIP"},"content":{"rendered":"<p>Um dos maiores desafios de uma WebApi \u00e9 como fazer com que os clientes usem a API o m\u00ednimo poss\u00edvel para n\u00e3o haver sobrecarga. Uma das formas mais simples de fazer com que o servidor fique menos carregado \u00e9 comprimir a resposta dada pela WebApi. Vamos aprender como neste artigo.<!--more--><\/p>\n<p>A compacta\u00e7\u00e3o GZIP, que vamos aplicar numa WebApi, permite compactar a resposta das chamadas em at\u00e9 90%. Estamos diminuindo o tempo de comunica\u00e7\u00e3o de dados entre API e cliente em troca do processamento extra na API compactando os dados. Ou seja, se sua WebApi est\u00e1 hospedada num servidor com um processador muito fraco, o resultado pode n\u00e3o ser o esperado.<\/p>\n<p>Isto posto, vamos imaginar o seguinte cen\u00e1rio. Eu criei uma WebApi bem simples, devolvendo uma lista de objetos do tipo <code>Pessoa<\/code>.<\/p>\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\">\n<p>&nbsp;<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\npublic class Pessoa\r\n{\r\n\u00a0\u00a0\u00a0 public string Nome { get; set; }\r\n\u00a0\u00a0\u00a0 public string Salario { get; set; }\r\n\u00a0\u00a0\u00a0 public string CorDosOlhos { get; set; }\r\n\u00a0\u00a0\u00a0 public int Idade { get; set; }\r\n\u00a0\u00a0\u00a0 public string Email { get; set; }\r\n\u00a0\u00a0\u00a0 public string Contato { get; set; }\r\n\u00a0\u00a0\u00a0 public string DataDeRegistro { get; set; }\r\n}\r\n<\/pre>\n<\/div>\n<div class=\"line number16 index15 alt1\">\n<p>Eu simplesmente estou trazendo um conjunto de 100 pessoas transformando <code>List&lt;Pessoa&gt;<\/code> e devolvendo o resultado.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\npublic class HomeController : ApiController\r\n{\r\n\u00a0\u00a0\u00a0 public List&lt;Pessoa&gt; Get()\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return JsonConvert.DeserializeObject&lt;List&lt;Pessoa&gt;&gt;(Resources.Informacao);\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<\/div>\n<div class=\"line number7 index6 alt2\"><a href=\"https:\/\/www.getpostman.com\/\" target=\"_blank\">Testando localmente esta WebApi usando o Postman<\/a>, vemos que o retorno tem aproximadamente 20 KBs de tamanho. Olhando de forma individual, 20 KBs n\u00e3o s\u00e3o nada. Mas imagine uma API acessada por v\u00e1rios clientes, e de forma simult\u00e2nea. Qualquer forma de agilizar a resposta \u00e9 v\u00e1lida.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-522 alignnone\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip01.jpg\" alt=\"\" width=\"700\" height=\"520\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip01.jpg 700w, https:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip01-300x223.jpg 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/div>\n<div class=\"line number7 index6 alt2\"><\/div>\n<div class=\"line number7 index6 alt2\">Precisamos instalar alguns pacotes NuGet para ativar a compress\u00e3o de WebApis. Selecione o projeto da WebApi e acesse o <strong>menu Tools &gt; NuGet Package Manager &gt; Package Manager Console<\/strong>.<\/div>\n<\/div>\n<div class=\"line number7 index6 alt2\"><\/div>\n<div class=\"line number7 index6 alt2\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-523 alignnone\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip02.jpg\" alt=\"\" width=\"700\" height=\"476\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip02.jpg 700w, https:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip02-300x204.jpg 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/div>\n<div class=\"line number7 index6 alt2\"><\/div>\n<div class=\"line number7 index6 alt2\">\n<p>Precisamos instalar os pacotes <strong>Microsoft.AspNet.WebApi.Extensions.Compression.Server<\/strong> e <strong>System.Net.Http.Extensions.Compression.Client<\/strong>. Voc\u00ea precisa usar o comando <strong>Install-Package<\/strong> para fazer a instala\u00e7\u00e3o. Digite as duas linhas abaixo, uma por vez:<\/p>\n<p><strong>Install-Package Microsoft.AspNet.WebApi.Extensions.Compression.Server<\/strong><\/p>\n<p><strong>Install-Package System.Net.Http.Extensions.Compression.Client<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-524 alignnone\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip03.jpg\" alt=\"\" width=\"700\" height=\"314\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip03.jpg 700w, https:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip03-300x135.jpg 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>Agora com ambos os pacotes instalados, acesse o arquivo <strong>Global.asax<\/strong> e adicione a linha abaixo. Basicamente, estamos criando um novo <code>MessageHandler<\/code> para aplicar a compress\u00e3o GZip em todas as chamadas da WebApi.<\/p>\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\">\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nGlobalConfiguration.Configuration\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .MessageHandlers\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));\r\n<\/pre>\n<\/div>\n<div class=\"line number3 index2 alt2\">Veja como fica a classe <code>WebApiApplication<\/code> do arquivo <strong>Global.asax<\/strong>:<\/div>\n<div class=\"line number3 index2 alt2\">\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\npublic class WebApiApplication : System.Web.HttpApplication\r\n{\r\n\u00a0\u00a0\u00a0 protected void Application_Start()\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GlobalConfiguration.Configuration\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .MessageHandlers\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));\r\n\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GlobalConfiguration.Configure(WebApiConfig.Register);\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<\/div>\n<div class=\"line number7 index6 alt2\">\n<p>E se testarmos novamente nossa WebApi, o tamanho da resposta caiu cerca de 75%, para cerca de 5 KBs!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"line number7 index6 alt2\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-525 alignnone\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip04.jpg\" alt=\"\" width=\"700\" height=\"520\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip04.jpg 700w, https:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/WebAPI_Gzip04-300x223.jpg 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/div>\n<div class=\"line number7 index6 alt2\"><\/div>\n<div class=\"line number7 index6 alt2\">Como visto, estamos adicionando um processamento extra em nossa WebApi em troca de uma vis\u00edvel economia no tr\u00e1fego de rede, fazendo com que a resposta fique menor e mais r\u00e1pida. Uma forma f\u00e1cil de desafogar o tr\u00e1fego de uma API sem perda de recursos. At\u00e9 a pr\u00f3xima!<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Um dos maiores desafios de uma WebApi \u00e9 como fazer com que os clientes usem a API o m\u00ednimo poss\u00edvel para n\u00e3o haver sobrecarga. Uma das formas mais simples de fazer com que o servidor fique menos carregado \u00e9 comprimir a resposta dada pela WebApi. Vamos aprender como neste artigo. <span class=\"ellipsis\">&hellip;<\/span> <span class=\"more-link-wrap\"><a href=\"https:\/\/gianfratti.com\/index.php\/comprimindo-a-resposta-de-uma-webapi-ativando-a-compactacao-gzip\/\" class=\"more-link\"><span>Read More &rarr;<\/span><\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2],"tags":[100,99],"class_list":["post-521","post","type-post","status-publish","format-standard","hentry","category-net-framework","tag-gzip","tag-webapi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/521","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/comments?post=521"}],"version-history":[{"count":5,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/521\/revisions"}],"predecessor-version":[{"id":530,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/521\/revisions\/530"}],"wp:attachment":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/media?parent=521"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/categories?post=521"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/tags?post=521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}