Exibindo produtos por palavra-chave com o Wrapper.Net

Vamos simular um formulário de pesquisa em um site, onde digitando os termos de pesquisa exibiremos a lista dos produtos encontrados.

Para a sequência do tutorial é 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 texto em que 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 e então 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<string, object> data = deserializer.Deserialize<Dictionary<string, object>>(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"],
                    	prodData["pricemax"]
                	);
        	}

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)
    	{
        	// Realiza a requisição à API do Buscapé e retorna os produtos com a palavra-chave
        	Apiki_Buscape_API.Apiki_Buscape_API apiBuscape = new Apiki_Buscape_API.Apiki_Buscape_API("564771466d477a4458664d3d", string.Empty, "BR", "json");
        	Apiki_Buscape_API.FiltrosFindProducts filtros = new Apiki_Buscape_API.FiltrosFindProducts();
        	filtros.Keyword = keyword;
        	string json_retorno = apiBuscape.FindProductList(filtros);
        	//lblMessage.Text = json_retorno;
        	// Converte JSON de retorno em um tipo Dictionary
        	JavaScriptSerializer deserializer = new JavaScriptSerializer();
        	Dictionary<string, object> data = deserializer.Deserialize<Dictionary<string, object>>(json_retorno);

        	if (data["totalresultsreturned"].ToString() == 0.ToString())
            	return false;

        	ArrayList products = (ArrayList)data["product"];

        	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"],
                    	prodData["pricemax"]
                	);
        	}

        	return true;

    	}

Deixe uma resposta

Topo