C#  - Fazendo requisições simples na web

 Neste artigo vou mostrar como fazer requisições simples na web usando a linguagem C#

É muito comum hoje em dia a necessidade de acessar recursos que estão na web em nossas aplicações criadas na linguagem C#.

Se outrora fazer esse tipo de operação dava trabalho hoje ela é bem simples de fazer.

A requisição web mais comum é uma simples requisição HTTP GET e para fazer isso na linguagem C# precisamos usar dois namespaces importantes que vão nos dar acesso às classes que possuem os recursos para realizar essa tarefa.

Using System.Net;
Using System.IO;

No namespace System.Net vamos obter a classe HttpWebRequest que vai fazer a maior parte do trabalho e no namespace System.IO vamos usar fluxos IO para obter os dados retornados. (Uma alternativa mais indicada seria usa HttpClient para versões do C# 4.5 ou superior)

Isso é tudo que precisamos.

Para testar nossas requisições precisamos de um serviço e de uma Url e para isso vamos usar o endereço: https://jsonplaceholder.typicode.com/ que oferece um serviço RESTful que podemos acessar de forma gratuita e obter dados fictícios.

Assim a requisição para : https://jsonplaceholder.typicode.com/posts vai retornar todos dados de posts no formato JSON abaixo:

Podemos obter também os dados pelo id montando uma  requisição do tipo : https://jsonplaceholder.typicode.com/posts/id

Observe que o id no final da URl é o id do usuário e é por onde a API espera vai encontrar o ID.

Vamos criar uma aplicação do tipo Console usando a linguagem C# e montar a nossa requisição conforme o código abaixo:

            
            var requisicaoWeb = WebRequest.CreateHttp("http://jsonplaceholder.typicode.com/posts/1");         
            requisicaoWeb.Method = "GET";
            requisicaoWeb.UserAgent = "RequisicaoWebDemo";

 

Neste código estamos criando um objeto HttpWebRequest e passando a URL para a qual queremos fazer a requisição GET.

O UserAgent usado apenas identifica o cabeçalho HtTTP como 'RequisicaoWebDemo'. Essa informação nem sempre é necessária e vai depender do serviço. Se você não usar e obter o erro HTTP 403 então vai ter que usar.

Até agora fizemos a requisição e precisamos tratar o retorno que é a nossa reposta. Para isso vamos usar o código abaixo:

            using (var resposta = requisicaoWeb.GetResponse())
            {
                var streamDados = resposta.GetResponseStream();
                StreamReader reader = new StreamReader(streamDados);
                object objResponse = reader.ReadToEnd();
                Console.WriteLine(objResponse.ToString());
                Console.ReadLine();
                streamDados.Close();
                resposta.Close();
            }

Afim de obter uma resposta legível precisamos obter um stream a partir do objeto response usando o método GetResponse() e então podemos armazenar nossa resposta como um simples objeto lendo a informação com ReadToEnd().

A seguir imprimimos o resultado no console usando :  Console.WriteLine(objResponse.ToString());

Vimos que a resposta retornada é um objeto JSON que é armazenado como um simples objeto, e, isso em alguns cenários pode não ser a melhor forma de tratar a resposta.

Vamos melhorar isso tratando os dados JSON retornados usando a API NewtonSoft.

Tratando dados JSON com NewtonSoft

Se formos trabalhar com JSON em nossas aplicações temos a disposição uma API fantástica chamada NewtonSoft que pode ser instalada via Nuget usando o comando via console :
Install-Package Newtonsoft.Json

Se preferir pode usar o Nuget Packages for Solution :

Após isso basta declarar o namespace e usar os recursos da API.

Agora que temos a ferramenta para tratar a nossa requisição vamos definir um objeto que irá representar os dados que vamos obter a partir do serviço REST.

Vamos definir uma classe com uma estrutura idêntica ao retornado pelo serviço. Para isso vamos criar a classe Post com o código a seguir:

    public class Post
    {
        public int Id { get; set; }
        public int userId { get; set; }
        public string title { get; set; }
        public string body { get; set; }
    }

A seguir temos que converter a nossa resposta JSON em um objeto Post, deserializando o objeto usando o método JsonConvert.DeserializeObject() conforme mostra o código abaixo:

var post = JsonConvert.DeserializeObject<Post>(objResponse.ToString());

O código completo fica assim :

using System;
using System.Net;
using System.IO;
using Newtonsoft.Json;
namespace RequisicoesWeb
{
    class Program
    {
        static void Main(string[] args)
        {
            var requisicaoWeb = WebRequest.CreateHttp("http://jsonplaceholder.typicode.com/posts/1");
            requisicaoWeb.Method = "GET";
            requisicaoWeb.UserAgent = "RequisicaoWebDemo";
            using (var resposta = requisicaoWeb.GetResponse())
            {
                var streamDados = resposta.GetResponseStream();
                StreamReader reader = new StreamReader(streamDados);
                object objResponse = reader.ReadToEnd();
                var post = JsonConvert.DeserializeObject<Post>(objResponse.ToString());
                Console.WriteLine(post.Id + " " + post.title + " " + post.body );
                Console.ReadLine();
                streamDados.Close();
                resposta.Close();
            }
            Console.ReadLine();
        }
    }
}

Enviando uma requisição HTTP POST

E se quisermos enviar uma requisição POST para atualizar dados ?

Vamos criar um método EnviaRequisicaoPOST() com o código abaixo:

        public static void EnviaRequisicaoPOST()
        {
            string dadosPOST = "title=macoratti";
            dadosPOST = dadosPOST + "&body=teste de envio de post";
            dadosPOST = dadosPOST + "&userId=1";
            var dados = Encoding.UTF8.GetBytes(dadosPOST);
            var requisicaoWeb = WebRequest.CreateHttp("http://jsonplaceholder.typicode.com/posts");
            requisicaoWeb.Method = "POST";
            requisicaoWeb.ContentType = "application/x-www-form-urlencoded";
            requisicaoWeb.ContentLength = dados.Length;
            requisicaoWeb.UserAgent = "RequisicaoWebDemo";
            //precisamos escrever os dados post para o stream
            using (var stream = requisicaoWeb.GetRequestStream())
            {
                stream.Write(dados, 0, dados.Length);
                stream.Close();
            } 
     //ler e exibir a resposta
    using (var resposta = requisicaoWeb.GetResponse())
    {
                var streamDados = resposta.GetResponseStream();
                StreamReader reader = new StreamReader(streamDados);
                object objResponse = reader.ReadToEnd();
                var post = JsonConvert.DeserializeObject<Post>(objResponse.ToString());
                Console.WriteLine(post.Id + " " + post.title + " " + post.body);
                streamDados.Close();
                resposta.Close();
   }
   Console.ReadLine(); 
      }
}

Quando postamos dados desejmaos construir os dados como um par  chave/valor separados por um caracstere & e converter essa string montada para um array de bytes de forma a podermos escrever os dados para um requisição stream.

            string dadosPOST = "title=macoratti";
            dadosPOST = dadosPOST + "&body=teste de envio de post";
            dadosPOST = dadosPOST + "&userId=1";

A seguir declaramos o método da requisição, o ContentType que informa qual o tipo de dados esta sendo passado na requisição(XML,JSON, etc),  e o ContentLength que define o tamanho do cabeçalho HTTP.

            requisicaoWeb.Method = "POST";
            requisicaoWeb.ContentType = "application/x-www-form-urlencoded";
            requisicaoWeb.ContentLength = dados.Length;
            requisicaoWeb.UserAgent = "RequisicaoWebDemo";

Depois usamos o método GetRequestStream() para obter um objeto stream para escrever os dados.

Concluimos repetindo o código para ler a requisição e exibir o seu conteúdo que pode ser visto na figura abaixo:

Embora essa abordagem possa parecer simples, existe outro caminho que podemos seguir para simplifica ainda mais o cenário de criar requisições para web.

Veremos isso em outro artigo abordando a classe HttpClient.

Pegue o projeto aqui :  RequisicoesWeb.zip

"Bendito o Deus e Pai de nosso Senhor Jesus Cristo, o qual nos abençoou com todas as bênçãos espirituais nos lugares celestiais em Cristo;"
Efésios 1:3

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 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti