Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cliente REST (Android SDK)

Avatar for rodrigorgs rodrigorgs
October 10, 2012

Cliente REST (Android SDK)

Avatar for rodrigorgs

rodrigorgs

October 10, 2012
Tweet

More Decks by rodrigorgs

Other Decks in Programming

Transcript

  1. MATC89: Aplicações para Dispositivos Móveis Universidade Federal da Bahia (UFBA)

    Rodrigo Rocha e Christina von Flach 2012.2 Acessando Serviços Web Android SDK
  2. 1º: Gambiarra • No onCreate: StrictMode.ThreadPolicy policy = new StrictMode.

    ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); • Assim permitimos acesso à rede na thread principal • Em outra aula aprenderemos a fazer do jeito certo, sem gambiarra
  3. AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="..." package="..." ... > <uses-sdk

    ... /> <uses-permission android:name="android.permission.INTERNET"/> ... Permissão para Internet
  4. ContatoResource.java public class ContatoResource { private static final String URL

    = "http://contatos-rest.herokuapp.com/contatos"; // Operações public Long insertContato(Contato contato) {...} public List<Contato> getContatos() {...} // JSON private Contato fromJSON(JSONObject obj) {...} private JSONObject toJSON(Contato contato) {...} // HTTP private String postUrl(String url, String body) {...} private String getUrl(String url) {...} } ContatoResource
  5. ContatoResource.java public List<Contato> getContatos() throws JSONException, ClientProtocolException, IOException { List<Contato>

    contatos = new ArrayList<Contato>(); String contatosStr = getUrl(URL); JSONArray array = new JSONArray(contatosStr); for (int i = 0; i < array.length(); i++) { JSONObject obj = array.getJSONObject(i); Contato contato = fromJSON(obj); contatos.add(contato); } return contatos; } Obter contatos
  6. ContatoResource.java private String getUrl(String url) throws ClientProtocolException, IOException { String

    responseBody = ""; HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); HttpResponse response = client.execute(httpGet); int status = response.getStatusLine().getStatusCode(); if (status == 200) { responseBody = readBody(response); } else { Log.e("ContatoResource", "Status = " + status); } return responseBody; } Obter contatos
  7. ContatoResource.java private String readBody(HttpResponse response) throws IOException { HttpEntity entity

    = response.getEntity(); InputStream content = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader( content)); StringBuilder builder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { builder.append(line); } return builder.toString(); } Obter contatos
  8. ContatoResource.java private Contato fromJSON(JSONObject obj) throws JSONException { String nome

    = obj.getString("nome"); String telefone = obj.getString("telefone"); long id = -1; if (obj.has("id")) id = obj.getLong("id"); return new Contato(id, nome, telefone); } Obter contatos
  9. MainActivity.java public void download(View v) throws Exception { ContatoResource res

    = new ContatoResource(); List<Contato> contatos = res.getContatos(); contatoDao.removeAll(); for (Contato contato : contatos) contatoDao.insert(contato); atualizarContatos(); } Obter contatos
  10. Problema • A interface do app congela enquanto se espera

    a resposta do servidor. • A solução é fazer a requisição em outra thread. • Veremos isso em outra aula.
  11. ContatoResource.java public Long insertContato(Contato contato) throws JSONException, ClientProtocolException, IOException {

    Long id = null; JSONObject json = toJSON(contato); String result = postUrl(URL, json.toString()); JSONObject jsonResult = new JSONObject(result); id = jsonResult.getLong("id"); return id; } Inserir contatos
  12. ContatoResource.java private String postUrl(String url, String body) throws ClientProtocolException, IOException

    { String responseBody = ""; HttpClient client = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); httpPost.setEntity(new StringEntity(body)); HttpResponse response = client.execute(httpPost); int status = response.getStatusLine().getStatusCode(); if (status == 201) { responseBody = readBody(response); } else { Log.e("ContatoResource", "Status = " + status); } return responseBody; } Inserir contatos
  13. ContatoResource.java private JSONObject toJSON(Contato contato) throws JSONException { JSONObject obj

    = new JSONObject(); obj.put("nome", contato.getNome()); obj.put("telefone", contato.getTelefone()); return obj; } Inserir contatos
  14. MainActivity.java public void upload(View v) throws Exception { String nome

    = editNome.getText().toString(); String telefone = editTelefone.getText().toString(); Contato contato = new Contato(0, nome, telefone); ContatoResource res = new ContatoResource(); Long id = res.insertContato(contato); Toast.makeText(this, "Criado contato com id = " + id, Toast.LENGTH_SHORT).show(); } Inserir contatos
  15. public boolean isNetworkAvailable() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo

    networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { return true; } return false; } Checar conexão requer a permissão ACCESS_NETWORK_STATE
  16. Checar conexão • Cheque a conexão antes de acessar ContatoResource

    • Exiba um Toast se a conexão não estiver disponível • Para testar: abra o DDMS, aba Emulator Control, e selecione Data: Denied