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