.NET  -  HttpWebRequest x WebClient x HttpClient


 Neste artigo vamos comparar 3 maneiras de realizar requisições HTTP : HttpWebReques, WebClient e HttpClient.

A plataforma .NET oferece 3 classes diferentes para consumir APIs REST. (Além delas a comunidade criou a RestSharp.)

Vamos fazer uma análise resumida de cada uma das classes envolvidas e tirar as nossas conclusões para saber qual a mais indicada para uso.

1- HttpWebRequest/HttpWebResponse

No princípio as classes padrão para consumir requisições HTTP eram : HttpWebRequest e HttpWebResponse que implementam as interfaces WebRequest e WebResponse.

A classe HttpWebRequest lhe dá controle em cada aspecto do objeto request/response como: timeouts, headers, protocols, etc. além de não bloquear a thread da interface com o usuário.

Dessa forma a classe HttpWebRequest fornece suporte para as propriedades e métodos definidos na classe WebRequest e para propriedades e métodos adicionais que permitem interagir usando o protocolo HTTP.

- O método Create() de uma instância da classe WebRequest para iniciar os objetos HttpWebRequest;
- O método GetResponse() realiza uma requisição síncrona através da propriedade RequestUri, retornando um objeto HttpWebResponse contendo a resposta de uma requisição;
- O método GetRequestStream() obtém um objeto stream usado para escrever os dados da requisição;

O problema é que para fazer um simples request precisamos de 5 linhas de código :

using System.IO
using System.Net

HttpWebRequest http = (HttpWebRequest)WebRequest.Create("http://macoratti.net");
WebResponse response = http.GetResponse();
MemoryStream stream = (MemoryStream)response.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string content = sr.ReadToEnd();

Assim, a chance de você cometer erros usando esta classe é maior. Dessa forma utilize essa opção se você precisar um controle adicional de baixo nível que ela oferece.

2- WebClient

A classe WebClient é uma abstração de alto nível construída no topo do HttpWebRequest para simplificar as tarefas mais simples envolvidas nas requisições HTTP.

Ela fornece métodos para enviar dados ou receber dados de qualquer recurso identificado pela URI; seja local , intranet ou internet. Assim temos:

Método para fazer o envio de arquivos para um recurso:

Métodos para fazer o download de arquivos a partir de um recurso:

Usar WebClient é um pouco mais lento que HttpWebRequest, mas essa desvantagem traz alguns benefícios como precisar de menos código e ser mais fácil de usar.

Assim para fazer uma requisição precisamos apenas de duas linhas de código ao invés de cinco usadas na classe HttpWebRequest:

using System.Net;

var cliente = new WebClient();
var text = cliente.DownloadString("http://macoratti.net/teste.html");

3- HttpClient

A classe HttpClient fornece poderosas funcionalidades e uma sintaxe melhor para os novos recursos da threading como dar suporte a await, além de habilitar o download em threads com melhor verificação e validação de código.

Assim classe HttpClient é atualmente a classe principal usada para enviar e receber mensagens HTTP através de HttpRequestMessage e HttpResponseMessage.  

Se você já utilizou anteriormente as classes WebClient e HttpWebRequest vai notar que a classe HttpClient possui diferenças importantes a saber:

  1. Uma instância HttpClient é usada para configurar extensões, definir headers padrão, cancelar requests e mais;
  2. Você pode emitir tantos pedidos quantos quiser através de uma única instância HttpClient;
  3. Clientes HttpClient não estão vinculados a um determinado servidor HTTP ou host; você pode enviar qualquer solicitação HTTP usando a mesma instância HttpClient;
  4. Você pode derivar de HttpClient para criar clientes especializados para determinados sites ou padrões;
  5. A classe HttpClient usa o novo padrão orientada a tarefa (Task) para lidar com solicitações assíncronas, possibilitando assim, gerenciar e coordenar de forma mais fácil solicitações pendentes;
    using System.Net.Http;
    HttpClient cliente = new HttpClient();
    string resultado = await cliente.GetStringAsync("http://www.macoratti.net/vbn_jqsm.htm");

O único problema é que ela esta disponível somente a partir da versão 4.5 da plataforma .NET. A partir desta versão a recomendação é usar esta classe.

"Porque estas nações, que hás de possuir, ouvem os prognosticadores e os adivinhadores; porém a ti o Senhor teu Deus não permitiu tal coisa."
Deuteronômio 18:14

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti