No artigo de hoje, nós vamos simular um formulário de pesquisa em um site, onde digitando os termos da pesquisa, exibiremos a lista dos produtos encontrados.
Para a sequência do artigo, é necessário termos o Wrapper.Net da API do Buscapé adicionado ao nosso projeto. Faça o download dos arquivos no nosso perfil do GitHub. Você pode adicionar somente a biblioteca .dll, ou se preferir, os arquivos fontes que também estão disponíveis.
Para efetuar a pesquisa, a primeira coisa que precisamos é de um campo de texto, no qual o usuário entrará com as palavras-chave, e de um botão para confirmar a ação. Também incluíremos um label para exibir mensagens informativas ao usuário. Não vamos dar muita atenção ao layout desses dois campos, pois o nosso foco aqui é o código para o desenvolvedor. O que precisamos então é algo semelhante à imagem:
Então, vamos no click do botão testar se algum valor foi preenchido para realizar a pesquisa na API do Buscapé.
protected void btnSearch_Click(object sender, EventArgs e) { string keyword = txtSearch.Text; if (keyword.Length == 0) { lblMessage.ForeColor = System.Drawing.Color.Red; lblMessage.Text = "Digite o termo para pesquisa"; } else { lblMessage.Text = string.Empty; if (!FindProductsByKeyword(keyword)) { lblMessage.ForeColor = System.Drawing.Color.Red; lblMessage.Text = "Nenhum produto encontrado"; } } }
Para a pesquisa no Buscapé, vamos implementar o método FindProductsByKeyword. Nesse método, instanciamos a classe Apiki_Buscape_API e também a FiltrosFindProducts, que nos auxiliarão na pesquisa à API. Para facilitar o tratamento do retorno, vamos mudar seu formato para JSON:
Apiki_Buscape_API.Apiki_Buscape_API apiBuscape = new Apiki_Buscape_API.Apiki_Buscape_API("564771466d477a4458664d3d", string.Empty, "BR", "XML"); Apiki_Buscape_API.FiltrosFindProducts filtros = new Apiki_Buscape_API.FiltrosFindProducts(); filtros.Keyword = keyword; string json_retorno = apiBuscape.FindProductList(filtros);
Para tratar o retorno em JSON, vamos precisar adicionar dois namespaces ao projeto:
using System.Web.Script.Serialization; using System.Collections.Generic;
Vamos converter os nós product de retorno para o tipo ArrayList que facilitará a exibição dos dados. Para isso, vamos precisar do auxílio de um objeto Dictionary:
JavaScriptSerializer deserializer = new JavaScriptSerializer(); Dictionary data = deserializer.Deserialize<Dictionary>(json_retorno); ArrayList products = (ArrayList)data["product"];
Agora, percorreremos o ArrayList products e extrairemos dele os dados que precisamos para exibir:
foreach (Dictionary<string, object> prod in products) { Dictionary<string, object> prodData = (Dictionary<string, object>)prod["product"]; // Imagem Dictionary<string, object> thumbnail = (Dictionary<string, object>)prodData["thumbnail"]; string imageSrc = thumbnail["url"].ToString(); // Url do produto ArrayList links = (ArrayList)prodData["links"]; Dictionary<string, object> productLink = (Dictionary<string, object>)links[1]; Dictionary<string, object> link = (Dictionary<string, object>)productLink["link"]; string url = link["url"].ToString(); lblMessage.Text += string.Format( "<p style=\"border: 1px solid #cccccc; width: 60%\">" + "<a style=\"display: block\" href=\"{1}\">{2} - {3}</a>" + "De R$ {4} até R$ {5} <br />" + "<img src=\"{0}\" />" + "</p>", imageSrc, url, prodData["id"], prodData["productname"], prodData["pricemin"],
Quando nossa pesquisa obtiver resultados, teremos na tela a listagem de produtos:
Também tratamos para exibir uma mensagem quando nenhum produto for retornado pela API:
Pronto, temos nossa ferramenta de pesquisa de produtos por palavras-chave. Abaixo, veja como ficou todo o código usado:
protected void btnSearch_Click(object sender, EventArgs e) { string keyword = txtSearch.Text; if (keyword.Length == 0) { lblMessage.ForeColor = System.Drawing.Color.Red; lblMessage.Text = "Digite o termo para pesquisa"; } else { lblMessage.ForeColor = System.Drawing.Color.Black; lblMessage.Text = string.Empty; if (!FindProductsByKeyword(keyword)) { lblMessage.ForeColor = System.Drawing.Color.Red; lblMessage.Text = "Nenhum produto encontrado"; } } } public bool FindProductsByKeyword(string keyword) {
Até a próxima!