Last active
May 2, 2016 13:25
-
-
Save rafaelromao/e10f69094b60176bd33e1e6b4541b422 to your computer and use it in GitHub Desktop.
Buscapé API C# Sample
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Realiza a busca no Buscapé e trata os resultados | |
private async Task ExecuteSearchAsync(string uri, CancellationToken cancellationToken) | |
{ | |
using (var request = new HttpRequestMessage(HttpMethod.Get, uri)) | |
{ | |
using (var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(5))) | |
{ | |
var buscapeResponse = await WebClient.SendAsync(request, cancellationTokenSource.Token); | |
if (buscapeResponse.StatusCode != HttpStatusCode.OK) | |
{ | |
Console.WriteLine(@"Não foi possível obter uma resposta do Buscapé!"); | |
} | |
else | |
{ | |
var resultJson = await buscapeResponse.Content.ReadAsStringAsync(); | |
dynamic responseMessage = JsonConvert.DeserializeObject(resultJson); | |
try | |
{ | |
foreach (JObject product in responseMessage.product) | |
{ | |
try | |
{ | |
var resultItem = ParseProduct(product); | |
await Console.WriteLine(resultItem); | |
} | |
catch (Exception e) | |
{ | |
Console.WriteLine($"Exception parsing product: {e}"); | |
} | |
} | |
} | |
catch (Exception e) | |
{ | |
Console.WriteLine($"Exception parsing response from Buscapé: {e}"); | |
Console.WriteLine("Nenhum resultado encontrado"); | |
return; | |
} | |
await Task.Delay(TimeSpan.FromSeconds(2), cancellationTokenSource.Token); | |
Console.WriteLine("Response sent!"); | |
} | |
} | |
} | |
} | |
// Faz o parse do Json retornado pelo Buscapé | |
private static string ParseProduct(JObject product) | |
{ | |
var obj = product.Properties().First(); | |
var name = obj.Value["productname"]?.Value<string>() ?? | |
obj.Value["productshortname"]?.Value<string>() ?? "Produto Desconhecido!"; | |
var pricemin = obj.Value["pricemin"]?.Value<string>(); | |
var pricemax = obj.Value["pricemax"]?.Value<string>(); | |
var text = name; | |
if (pricemin != null && pricemax != null) | |
text += $"\nDe R$ {pricemin} a R$ {pricemax}."; | |
var thumbnail = | |
obj.Value["thumbnail"]["formats"].Single( | |
f => f["formats"]["width"].Value<int>() == 100)["formats"]["url"] | |
.Value<string>(); | |
var link = | |
obj.Value["links"].Single( | |
l => l["link"]["type"].Value<string>() == "product")["link"]["url"] | |
.Value<string>(); | |
var resultItem = $"{thumbnail} - {text} - {link}"; | |
return resultItem; | |
} | |
// Monta a uri de busca, dada uma keywork | |
private async Task<string> ComposeSearchUriAsync(string keyword) | |
{ | |
var originalKeyword = keyword; | |
var categoryId = await DecodeCategoryIdAsync(keyword); | |
if (categoryId > 0) | |
keyword = string.Join("+", keyword.Split(' ').Skip(1)); | |
const int pageSize = 3; | |
var page = 1; | |
var parameters = $"myBuscapeAppToken/BR?results={pageSize}&page={page}&keyword={keyword}&format=json&sort=price"; | |
if (categoryId > 0) | |
parameters += $"&categoryId={categoryId}"; | |
var uri = $"http://sandbox.buscape.com.br/service/findProductList/{parameters}"; | |
return uri; | |
} | |
// Identifica a categoria de busca, uma vez que o parametro keywork pode conter mais de uma palavra, e nesse caso a primeira deve ser considerada uma categoria | |
private async Task<int> DecodeCategoryIdAsync(string keyword) | |
{ | |
try | |
{ | |
var keywords = keyword.Split(' '); | |
if (keywords.Length > 1) | |
{ | |
var category = keywords[0]; | |
var categoryParameters = $"myBuscapeAppToken/BR?keyword={category}&format=json"; | |
var categoryUri = $"http://sandbox.buscape.com.br/service/findCategoryList/{categoryParameters}"; | |
using (var request = new HttpRequestMessage(HttpMethod.Get, categoryUri)) | |
{ | |
using (var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(5))) | |
{ | |
var buscapeResponse = await WebClient.SendAsync(request, cancellationTokenSource.Token); | |
if (buscapeResponse.StatusCode != HttpStatusCode.OK) | |
return 0; | |
var resultJson = await buscapeResponse.Content.ReadAsStringAsync(); | |
var responseMessage = JsonConvert.DeserializeObject<JObject>(resultJson); | |
return responseMessage["subcategory"][0]["subcategory"]["id"].Value<int>(); | |
} | |
} | |
} | |
return 0; | |
} | |
catch (Exception) | |
{ | |
return 0; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment