4/6/2009 | Tags:api, datatables, JavaScript, webservice, xpath, yahoo!, yql | Escrito por: Dirceu Pauka Jr.
Meu último post foi uma tentativa de explicar o funcionamento da Yahoo Query Language. No final falei da possibilidade de se fazer um Widget do Submarino com a YQL e agora volto para implementar o prometido.
YQL
Como eu disse existe um post explicando a YQL, porém aqui vai uma explicação rápida:
A YQL pode ser usada para buscar dados nas APIs do Yahoo (Flickr, Delicious, Placemaker, Maps, …), nas APIs do DataTables (Twitter, Amazon, GeoLocation, …) ou em qualquer outro documento da web (página HTML).
Para mostrar como a busca em um documento qualquer da web é feita, escrevi o seguinte código:
Para testar use o console da YQL ou veja teste dessa busca. O YQL vai retornar o conteúdo pedido em XML ou JSON.
JSONP
“JSON with Padding” é uma técnica que permite o carregamento assíncrono de informações de um domínio externo.
Toda biblioteca de JavaScript que se preze possui um método para esse procedimento.
jQuery: $.getJSON(url, function(data) { // callback });
MooTools: Request.JSON([options]);
A implementação desse tipo de requisição é bem simples.
Sabemos que o retorno de um arquivo chamado pela tag script é imediatamente executado pelo interpretador JavaScript.
Também sabemos que um objeto em JS pode ser representado por {} e pode conter pares de chave/valor. Ex: var Objeto = { chave: ‘valor’ };
Assim sendo, o que precisamos agora é que o conteúdo de um arquivo que vai ser requisitado utilizando a tag script seja uma chamada a nossa função previamente declarada.
Atente que ao contrario do xhttprequest o elemento HTML script não possui limitações quanto ao domínio que a requisição pode ser feita. Porém, para que a técnica funcione é necessário que o servidor requisitado retorne (em texto puro) uma chamada para nossa função.
Requisição:
http://pomoti.com/arquivo.php?callback=recebe_json
PHP simples para retorno:
echo $_GET['callback'] . ‘( {chave: “valor”} )’;
Retorno:
recebe_json( {chave: ‘valor’} );
Todos webservices que queiram trabalhar com JSON devem, então, aceitar um parâmetro para envio de callback.
Widget do Submarino
Fundamentadas as técnicas necessárias para a implementação vamos ao código.
// tentando duas querys diferentes. a estrutura do submarino pode ser alterada e isso evita quebrar
getJSON(query1);
}
function getJSON(query) {
// monta a requisição REST
var url = ‘http://query.yahooapis.com/v1/public/yql?q=’+
encodeURIComponent(query)+
‘&format=json’+
‘&callback=Submarino.recebe’;
// se tag head não existir, cria uma para evitar problemas
if (!document.getElementsByTagName(’head’)[0]) {
document.getElementsByTagName(’body’)[0].appendChild( document.createElement(’head’) );
}
// adiciona o elemento



10 Comentários so far
Leave a comment
dirs cara muito boa sua explicação sobre o YQL. Nossa isso ai me deu varias ideias loucas pra implementar…
fl
By anestesya on 06.04.09 8:39 am | Permalink
Mandando muito bem nos post cara. Parabéns!
By Maurício Maia on 06.04.09 2:55 pm | Permalink
Fazia tempo que eu não passava por aqui.
Tinha feito umas brincadeiras com feeds outro dia naquele console YQL. Achei animal!
Não tinha pesquisado posts sobre, mas está ae uma boa referência para quando eu ou alguém precisar.
Abraço.
By Helder Santana on 06.22.09 8:09 pm | Permalink
Olá, muito interessante esse artigo.
Uma observação:
Quando eu clico no link que você disponibilizou “está aqui um exemplo.” abre a tela em branco. É assim mesmo?
Gostaria de ver funcionando.
By Pietro on 07.06.09 6:54 pm | Permalink
No meu caso também não funciona. A tela fica branca.
By Reginaldo on 07.23.09 4:28 pm | Permalink
Então… realmente temos um problema aqui. A página do Submarino muda de estrutura muito fácil (apesar dos produtos continuarem no mesmo “padrão”).
Em outra aplicação que fiz utilizando o YQL também ocorre esse problema quando o elemento não existe.
Vou trabalhar em cima e ver o que consigo fazer. Abraço!
By Dirceu Pauka Jr. on 07.23.09 5:21 pm | Permalink
Alterei o código para buscar por duas querys diferentes.
Espero que assim seja possivel todo mundo ver o exemplo.
Lembrando que incentivo a todos modificarem meu código e fazerem funcionar o que estiver com problema.
By Dirceu Jr. on 08.18.09 9:08 pm | Permalink
Parou de funcionar novamente =D isso deve acontecer porque o submarino deve alterar a estrutura das páginas com alguma frequência.
Falopa!
By John-Henrique on 10.20.09 11:09 am | Permalink
Então em vez das ofertas do dia vou usar a busca deles que é mais consistente que a home.
Acho que eles deveriam fazer uma API…
By Dirceu Jr. on 10.20.09 11:53 am | Permalink
Estou apanhando pra caramba, existe alguma função que faz o mesmo que print_r() no PHP?
Falopa!
By John-Henrique on 10.21.09 12:12 pm | Permalink
Deixe um comentário
Quebras de linha e parágrafo automáticas, seu email nunca será mostrado, HTML permitido:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>