C# - Fazendo requisições simples na web |
Neste artigo vou mostrar como fazer requisições simples na web usando a 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(); }
}
|
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Visual Studio - Dica de produtividade - Quick Launch - Macoratti.net
Visual Studio - Dica de produtividade - Nuget - Macoratti.net
ASP .NET Web API - Consumindo uma Web API em um ... - Macoratti.net
VB .NET - Obtendo informações de uma web page - Macoratti.net
Consumindo uma Web API em um projeto WPF ... - Macoratti.net