Um dos princípios do caos quando se pensa em trabalhar com banco de dados é a possibilidade de utilizar URL + SQL para retornar resultados (basicamente… SQL Injection). Bem, o Google teve a ousadia ignorar o que diz respeito a este principio, deixando de lado arquiteturas de gente grande, (como o Open Data Protocol) criando a API do Fusion Tables baseada em GET/POST de queries.
Para inicio de conversa, vamos ao método de autenticação, existem três formas de autenticação, sendo a mais simples baseada em POST “email+senha+serviço” resultando em um token (infelizmente não é a mais segura).
Exemplo (método de autenticação com o google em C#):
static string GetToken(string email, string password)
{
string token;
//
var user = HttpUtility.UrlEncode(email);
var pass = HttpUtility.UrlEncode(password);
//
var url = "https://www.google.com/accounts/ClientLogin";
//
var reqClient = (HttpWebRequest)WebRequest.Create(url);
reqClient.Method = "POST";
reqClient.ContentType = "application/x-www-form-urlencoded";
//
var sb = new StringBuilder();
sb.Append("accountType=GOOGLE");
sb.Append(string.Format("&Email={0}", user));
sb.Append(string.Format("&Passwd={0}", pass));
sb.Append("&service=fusiontables");
sb.Append("&source=fusiontables.ApiExample");
sb.Append("&logintoken=");
sb.Append("&logincaptcha=");
//
var data = Encoding.ASCII.GetBytes(sb.ToString());
reqClient.ContentLength = data.Length;
//
using (var post = reqClient.GetRequestStream())
post.Write(data, 0, data.Length);
//
using (var res = (HttpWebResponse)reqClient.GetResponse())
using (var stIn = new StreamReader(res.GetResponseStream()))
{
var s = stIn.ReadToEnd();
//
var parts = s.Split('=');
token = parts[3];
}
//
return token;
}
Para retornar consultas SQL, será necessário utilizar o token da autenticação no cabeçalho de uma chamada web semelhante a:
http://tables.googlelabs.com/api/query?sql=SELECT…
Mas não se preocupe, o SQL Injection que vimos acima é possível realizar em POST.
Exemplo (método para executar SQL no google fusion tables em C#):
static string Execute(string email, string password, string query)
{
string result;
//
var sql = string.Format("sql={0}", HttpUtility.UrlEncode(query));
//
var url_fusion_tables = @"http://tables.googlelabs.com/api/query";
//
var reqClient = (HttpWebRequest)WebRequest.Create(url_fusion_tables);
reqClient.Method = "POST";
reqClient.ContentType = "application/x-www-form-urlencoded";
//
var token = string.Format("Authorization: GoogleLogin auth={0}"
, GetToken(email, password));
//
reqClient.Headers.Add(token);
//
var data = Encoding.ASCII.GetBytes(sql);
reqClient.ContentLength = data.Length;
//
using (var post = reqClient.GetRequestStream())
post.Write(data, 0, data.Length);
//
using (var res = (HttpWebResponse)reqClient.GetResponse())
using (var stIn = new StreamReader(res.GetResponseStream()))
result = stIn.ReadToEnd();
//
return result;
}
Métodos criados, vamos à execução.
Exemplo:
static void Main() {
var email = "mail@@gmail.com";
var password = "XXX";
//
var query = "SELECT ROWID, LastName, FirstName FROM 20108 LIMIT 10";
//
Console.Write(Execute(email, password, query));
Console.ReadKey();
}
E por fim o resultado da query em formato CSV:
O nome da tabela pode ser conseguido a partir da url quando navegamos por uma tabela no Google Fusion Tables, como no exemplo abaixo 20108.
Espero que tenham gostado, mas antes de utilizar o Google Fusion Tables em qualquer projeto não esqueça conhecer um pouco mais sobre suas limitações.
Maiores informações:
http://code.google.com/intl/pt-BR/apis/fusiontables/
Artigo Relacionado:
https://sqlfromhell.wordpress.com/2009/06/14/google-fusion-tables/