C#

8 ago, 2019

C# – Transferindo dados via HTTP

Publicidade
Neste artigo vamos recordar como transferir dados via HTTP usando C#.

Acessar e fazer o download ou o upload de dados a partir de uma localização especificada por uma URL é uma das tarefas mais comuns hoje em dia.

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 URL; 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 desvantagem traz alguns benefícios como precisar de menos código e ser mais fácil de usar.

Neste artigo, vamos usar os métodos WebClient.UploadDataTaskAsync e WebClient.DownloadDataTaskAsync para realizar essas tarefas em uma aplicação console.

recursos usados:

  • Visual Studio 2017 Community

Criando o projeto Console

Crie um projeto do tipo Console App(.NET Framework) com o nome TransfDataHttp.

Vamos iniciar fazendo o download dos dados de uma página web. A título de exemplo vou acessar o endereço especificado pela URL : http://www.macoratti.net/Default.aspx

Agora inclua o código abaixo no arquivo Program.cs :

using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace TransfDataHttp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string url = "http://www.macoratti.net/Default.aspx";
            await DownloadAsync(url);
            Console.ReadLine();
        }
        static async Task DownloadAsync(string url)
        {
            Uri uri = new Uri(url);
            // cria uma instância de webclient
            using (WebClient cliente = new WebClient())
            {
                // OBTEM O CONTEÚDO DO ARQUIVO
                Console.WriteLine($"Downloading {uri.AbsoluteUri}");
                // faz o download da pagina e armazena em um array de bytes
                byte[] bytes;
                try
                {
                    // Existe também o método DownloadDataAsync 
                    bytes = await cliente.DownloadDataTaskAsync(uri);
                }
                catch (WebException we)
                {
                    Console.WriteLine(we.ToString());
                    return;
                }
                // Escreve a saida HTML
                string page = Encoding.UTF8.GetString(bytes);
                Console.WriteLine(page);
            }
        }
    }
}

Estou usando a versão 7.2 da linguagem C# (para poder usar o Task em Main) e definindo o método DownloadAsync(string url) que recebe a url especificada e usa o método DownloadDataTaskAsync(uri) para fazer o download dos dados da página.

Nota:  Para definir a versão da linguagem acessa a janela de propriedades do projeto e clique em Build, depois em Advanced e a seguir selecioni a versão conforme mostra a figura a seguir:

Vejamos agora como fazer o upload de dados usando o método UploadFileTaskAsync para enviar um arquivo para um servidor.

Vamos incluir um novo projeto chamado UploadData na solução criada anteriormente.

Este método carrega o arquivo local especificado para um recurso como uma operação assíncrona usando um objeto Task. Esse método não bloqueia o thread de chamada.

A sintaxe é :   UploadFileTaskAsync(Uri, String, String)

onde:

  • address  – Uri – indica a uri do recurso que vai receber o arquivo;
  • method –  String – Indica o método usado par enviar os dados. Se for null, o padrão será POST para http e STOR para ftp;
  • filename– String – Indica o arquivo local a ser enviado.

Vamos enviar o arquivo teste_pdf.pdf que está na pasta c:\dados para a url : http://www.macoratti.net

Assim vamos definir o método assim: UploadFileTaskAsync(uri, “c:\\dados\\Teste_pdf.pdf”);

Agora inclua o código abaixo no arquivo Program.cs

using System;
using System.Net;
using System.Threading.Tasks;
namespace UploadData
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string url = "http://www.macoratti.net/Default.aspx";
            await UploadDataAsync(url);
            Console.ReadLine();
        }
        static async Task UploadDataAsync(string url)
        {
            Uri uri = new Uri(url);
            // cria uma instância de webclient
            using (WebClient cliente = new WebClient())
            {
                Console.WriteLine($"Enviando para {uri.AbsoluteUri}");
                try
                {
                    // Existem também o método UploadFileAsync 
                    await cliente.UploadFileTaskAsync(uri, "c:\\dados\\Teste_pdf.pdf");
                    Console.WriteLine($"Dados enviados com sucesso to {uri.AbsoluteUri}");
                }
                catch (WebException we)
                {
                    Console.WriteLine(we.ToString());
                }
            }
        }
    }
}

Agora criamos o método UploadDataAsync(string url) e invocamos o método UploadFileTaskAsync() passando a url e o nome do arquivo a ser transferido via POST.

Abaixo vemos o resultado da execução do código:

Segue o projeto completo aqui :    TransfDataHttp.zip