Back-End

12 jan, 2017

C# – Fazendo requisições simples na web

Publicidade

Neste artigo, vou mostrar como fazer requisições simples na web usando a linguagem C#. É muito comum, hoje, a necessidade de acessar recursos que estão na web em nossas aplicações C#. Se outrora fazer esse tipo de operação dava trabalho, hoje ele é 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. 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:

c_webreq11

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 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());

c_webreq12

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:

c_webreq13

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, desserializando 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, desejamos 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 está 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.

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

c_webreq14

Embora essa abordagem possa parecer simples, existe outro caminho que podemos seguir para simplificar 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