Recentemente, comecei a utilizar a API do Apontador (http://api.apontador.com.br/) para testar as funcionalidades e, achei muito bacana.
Tive a idéia de desenvolver uma aplicação para Android, que utiliza Java. Como não quero mostrar os fins, mas os meios, vou tentar detalhar como utilizar a API Apontador em Java. Notei que no site oficial, os exemplos são com PHP e Python.
Como utilizei duas ou três bibliotecas, a integração ficará por parte de vocês.
Vamos lá?
Primeiramente, baixem as bibliotecas que foram utilizadas para “brincar” com a API.
Base64 – http://ostermiller.org/utils/download.html
JSON – http://www.json.org/java/
Eu preferi utilizar o formato JSON ao invés do XML, que é nativo.
Depois de encontrar o que precisava, criei uma classe com um método para fazer a chamada à API do Apontador. Segue a classe. Note que os valores consumerKey e consumerSecret devem ser gerados no site da própria API.
//obtem classes necessárias para requisição e resposta via http
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import org.json.JSONArray;
import org.json.JSONObject;
import aptUtil.AptLocal;
import aptUtil.AptLocalList;
import com.Ostermiller.util.Base64;
public class AptBasic {
private String consumerKey;
private String consumerSecret;
private String apiURL;
/**
* Construtor da classe
* Define as chaves do Apontador
* Define a url da api Apontador
*/
public AptBasic() {
this.consumerKey = new String("gerar o seu codigo no site api.apontador.com.br");
this.consumerSecret = new String("gerar o seu codigo no site api.apontador.com.br");
this.apiURL = new String("http://api.apontador.com.br/v1");
}
public AptLocalList search(String name, String city, String state) {
AptLocalList locals = new AptLocalList();
try {
//modifica encoding do parâmetros antes da busca, para ficarem no formato de URL
//o encoding UTF-8 é o encoding que eu estava utilizando - não é conversão para UTF-8
//o que foi feito abaixo seria semelhante ao urlencode e não ao utf8_encode
name = URLEncoder.encode(name, "UTF-8");
city = URLEncoder.encode(city, "UTF-8");
state = URLEncoder.encode(state, "UTF-8");
//realiza chamada a url
String urlApt = new String(this.apiURL.concat("/search/places/byaddress?city=" + city + "&state=" + state + "&term=" + name).concat("&type=json"));
URL url = new URL(urlApt);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Authorization", "Basic " + this.getKey());
//converte retorno da chamada http para string - retorno em json
String res = new String("");
String aux = new String("");
BufferedReader buff = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while((aux = buff.readLine()) != null) {
res = res.concat(aux).concat("\n");
}
conn.getInputStream().close();
//salva os valores da string json no objeto de locais
JSONObject json = new JSONObject(res);
JSONArray places = ((JSONObject) json.get("search")).getJSONArray("places");
locals.setTotal(Integer.parseInt(((JSONObject) json.get("search")).getString("result_count")));
locals.setPage(Integer.parseInt(((JSONObject) json.get("search")).getString("current_page")));
for(int i = 0; i < places.length(); i++) {
JSONObject pl = places.getJSONObject(i).getJSONObject("place");
AptLocal local = new AptLocal();
//atributos comuns
local.setId(pl.getString("id"));
local.setName(pl.getString("name"));
local.setReview(new Integer(pl.getString("review_count")));
local.setUrl(pl.getString("main_url"));
local.setUrl2(pl.getString("other_url"));
local.setIcone(pl.getString("icon_url"));
local.setRating(new Double(pl.getString("average_rating")));
//endereço
local.setAddress(
pl.getJSONObject("address").getString("street"),
pl.getJSONObject("address").getString("number"),
pl.getJSONObject("address").getString("district"),
pl.getJSONObject("address").getString("complement"),
pl.getJSONObject("address").getString("zipcode"),
pl.getJSONObject("address").getJSONObject("city").getString("name"),
pl.getJSONObject("address").getJSONObject("city").getString("state"),
pl.getJSONObject("point").getString("lng"),
pl.getJSONObject("point").getString("lat")
);
//categoria
local.setCategory(
pl.getJSONObject("category").getString("id"),
pl.getJSONObject("category").getString("name"),
pl.getJSONObject("category").getJSONObject("subcategory").getString("id"),
pl.getJSONObject("category").getJSONObject("subcategory").getString("name")
);
locals.add(local);
}
} catch (Exception e) {
System.out.println("Erro na URL\n" + e.getLocalizedMessage());
}
return locals;
}
/**
* Formata o consumerKey e consumerSecret de acordo com o que a API do Apontador solicita
* @return String
*/
private String getKey() {
return Base64.encode(this.consumerKey.concat(":").concat(this.consumerSecret));
}
}
A classe que acessa e obtem os dados é esta. As que guardam os dados (AptLocalList, AptLocal, AptAddress e AptCategory) são apenas classes para tratar os valores recebidos e formatar o que for necessário. Se alguém quiser, pode pedir que eu posto. Não coloquei aqui para não perder o foco de chamada à API do Apontador.
Espero que tenham gostado.
abs,
Luis Laranja
public AptLocalList search(String name, String city, String state) {AptLocalList locals = new AptLocalList();try {
//modifica encoding do parâmetros antes da busca, para não fazer caca
name = URLEncoder.encode(name, “UTF-8″);
city = URLEncoder.encode(city, “UTF-8″);
state = URLEncoder.encode(state, “UTF-8″);
//realiza chamada a url
String urlApt = new String(this.apiURL.concat(“/search/places/byaddress?city=” + city + “&state=” + state + “&term=” + name).concat(“&type=json”));
URL url = new URL(urlApt);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty(“Authorization”, “Basic ” + this.getKey());
//converte retorno da chamada http para string – retorno em json
//”result_count”:”200″,”current_page”:”1″}}
JSONObject json = new JSONObject(convertStreamToString(conn.getInputStream()));
JSONArray places = ((JSONObject) json.get(“search”)).getJSONArray(“places”);
locals.setTotal(Integer.parseInt(((JSONObject) json.get(“search”)).getString(“result_count”)));
locals.setPage(Integer.parseInt(((JSONObject) json.get(“search”)).getString(“current_page”)));
for(int i = 0; i < places.length(); i++) {
JSONObject pl = places.getJSONObject(i).getJSONObject(“place”);
AptLocal local = new AptLocal();
//atributos comuns
local.setId(pl.getString(“id”));
local.setName(pl.getString(“name”));
local.setReview(new Integer(pl.getString(“review_count”)));
local.setUrl(pl.getString(“main_url”));
local.setUrl2(pl.getString(“other_url”));
local.setIcone(pl.getString(“icon_url”));
local.setRating(new Double(pl.getString(“average_rating”)));
//endereço
local.setAddress(
pl.getJSONObject(“address”).getString(“street”),
pl.getJSONObject(“address”).getString(“number”),
pl.getJSONObject(“address”).getString(“district”),
pl.getJSONObject(“address”).getString(“complement”),
pl.getJSONObject(“address”).getString(“zipcode”),
pl.getJSONObject(“address”).getJSONObject(“city”).getString(“name”),
pl.getJSONObject(“address”).getJSONObject(“city”).getString(“state”),
pl.getJSONObject(“point”).getString(“lng”),
pl.getJSONObject(“point”).getString(“lat”)
);
//categoria
local.setCategory(
pl.getJSONObject(“category”).getString(“id”),
pl.getJSONObject(“category”).getString(“name”),
pl.getJSONObject(“category”).getJSONObject(“subcategory”).getString(“id”),
pl.getJSONObject(“category”).getJSONObject(“subcategory”).getString(“name”)
);
locals.add(local);
}
// System.out.println(((JSONObject) json.get(“search”)).getJSONArray(“places”).toString());
} catch (Exception e) {
System.out.println(“Erro na URL\n” + e.getLocalizedMessage());
}
return locals;
}