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

Cliente REST (Android SDK)

rodrigorgs
October 10, 2012

Cliente REST (Android SDK)

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