.NET

19 jan, 2017

.NET – HttpWebRequest x WebClient x HttpClient

Publicidade

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

A plataforma .NET oferece três classes diferentes para consumir APIs REST (além delas a comunidade criou a RestSharp). Agora, vamos fazer uma análise resumida de cada uma delas 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 inicia 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 do 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:

  • OpenWrite – retorna um Stream usado para enviar dados para um recurso;
  • UploadData – envia um array de byte para o recurso e retorna um array de byte contendo qualquer resposta;
  • UploadFile – envia um arquivo local para um recurso e retorna um array de byte contendo qualquer resposta;
  • UploadValues – envia um NameValueCollection para o recurso e retorna um array de byte contendo qualquer resposta.

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

  • DownloadData – efetua o download de dados de um recurso e retorna um array de byte;
  • DownloadFile – faz o download de dados de um recurso para um arquivo local;
  • OpenRead – retorna os dados de um recurso com um Stream.

Usar WebClient é um pouco mais lento que HttpWebRequest, mas essa leve 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, a 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 orientado 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 está disponível somente a partir da versão 4.5 da plataforma .NET. A partir desta versão, a recomendação é usar esta classe.