APIs e Microsserviços

31 ago, 2012

Exibindo produtos por palavra-chave com o Wrapper.Net do Buscapé

Publicidade

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!