Tutorial: Acessando um servidor Rails através de um Android
Olá, neste tutorial vamos mostrar com fazer um conexão a partir de um aplicativo Android em um servidor Rails e acessar seu banco de dados.
Vamos usar o Ruby on Rails 3.2 e o Android 2.1 neste tutorial.
Para continuar esse tutorial é precisamos de um servidor Rails já configurado, aqui você pode aprender como fazer isso.
1 – Criando um novo projeto Rails
Começamos criando um novo projeto:
cd Tutorial
Configure o acesso ao banco de dados:
E edite o usuário e senha de seu banco de dados.
Crie seu banco de dados no servidor:
E crie um scaffold de uma tabela. Neste tutorial vamos criar um exemplo simples de blog.
Um blog tem vários posts e um post tem um Titulo e um Corpo de texto:
rake db:migrate
rails server -d
Agora temos uma tabela de posts criada em nosso banco de dados e nosso servidor foi iniciado.
Podemos checar os posts adicionados em nosso servidor através do endereço: http://localhost:3000/posts
Crie alguns posts para que possamos recuperá-los através do Android.
2 – Acessando dados
Com o comando scaffold já temos funções pré definidas para recuperar informações, tudo que precisamos fazer agora é extraí-las a partir do Android.
Pelo próprio browser podemos fazer essas chamadas, a primeira (padrão) é a http://localhost:3000/posts, que já vimos.
Se fizer-mos a chamada assim http://localhost:3000/posts.json, receberemos :
[{"body":"Ol\u00e1, neste primeiro post sobre Ruby on Rails vou descrever como instala-lo no Ubuntu. Para este tutorial estou usando o Ubuntu 11.04, Ruby 1.9.3, Rails 3.2 e MySQL 5.1","created_at":"2012-07-05T17:28:10Z","id":1," title":"Tutorial: Instalando Ruby On Rails 3.2 No Ubuntu Com MySQL","updat ed_at":"2012-07-05T17:54:27Z"},{"body":"Neste m\u00eas de junho foi minist rado um minicurso de Ruby on Rails para os alunos do laborat\u00f3rio. O m aterial se encontra no link.","created_at":"2012-07-05T17:54:57Z","id":2," title":"Minicurso De Ruby On Rails","updated_at":"2012-07-05T17:54:57Z"},{ "body":"Ol\u00e1, neste tutorial vamos mostrar com fazer um conex\u00e3o a partir de um aplicativo Android em um servidor Rails e acessar seu banco de dados.\r\nVamos usar o Ruby on Rails 3.2 e o Android 2.1 neste tutorial .\r\nPara continuar esse tutorial \u00e9 precisamos de um servidor Rails j\u00e1 configurado, aqui voc\u00ea pode aprender como fazer isso.","creat ed_at":"2012-07-05T17:55:24Z","id":3,"title":"Tutorial: Acessando Um Servi dor Rails Atrav\u00e9s De Um Android","updated_at":"2012-07-05T17:55:24Z"}]
Ou seja, já podemos receber os dados estruturados em JSON pronto para o uso.
Agora vamos criar um projeto no Android e configurá-lo para fazer as chamadas em nosso projeto Rails.
Primeiramente no Manifest.xml, adicione permissão para o Android poder acessar a rede:
<uses-permission android:name=”android.permission.INTERNET”/>
Agora vamos criar a classe que fará a conexão com o servidor Rails. Vamos chamá-la de ConnectionManager.java
public class ConnectionManager { private final static String PATH = "http://0.0.0.0:3000/"; private final static String LOGTAG = "ConnectionManager"; public static JSONArray request(String table) { String result = ""; // HTTP GET try { HttpClient httpclient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(new URI(PATH + table + ".json")); HttpResponse response = httpclient.execute(httpGet); HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); // Converte a resposta em uma String try { BufferedReader reader = new BufferedReader( new InputStreamReader(is, "utf-8"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result = sb.toString(); } catch (Exception e) { Log.e(LOGTAG, "Error converting result " + e.toString()); } } catch (Exception e) { Log.e(LOGTAG, "Error in http connection " + e.toString()); } Log.i(LOGTAG, "Banco - " + table + " - Resposta: " + result); // Transforma a String de resposta em um objeto JSON try { JSONArray jArray = new JSONArray(result); return jArray; } catch (JSONException e) { Log.e(LOGTAG, "Error parsing data " + e.toString()); } return new JSONArray(); } } |
Com essa classe podemos fazer chamadas estáticas e recuperar os dados do blog. Repare que na String PATH, temos que configurar o IP da maquina de onde vamos recuperar nossas informações, modifique esse IP para o IP da maquina onde o seu servidor Rails está funcionando.
Agora vamos preparar uma lista que receberá essas informações.
Vamos usar uma ListActivity simples para isso.
public class MainActivity extends ListActivity { private static final String ID = "id"; private static final String TITLE = "title"; private static final String BODY = "body"; private static final String CREATED_AT = "created_at"; private static final String UPDATED_AT = "updated_at"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); JSONArray jposts = ConnectionManager.request("posts"); //Nomes dos itens que serão capturados no map String[] from = new String[] {ID, TITLE, BODY, CREATED_AT, UPDATED_AT}; //ID dos itens descritos no XML dos itens (list_item.xml no caso) int[] to = new int[] {R.id.item0, R.id.item1, R.id.item2, R.id.item3, R.id.item4}; //Lista de itens que vão preencher a lista List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>(); try { //Obtendo Posts for(int i = 0; i < jposts.length(); i++) { //Repare que a chave do mapa precisa ser a mesma chave descrita no vetor from JSONObject jpost = jposts.getJSONObject(i); HashMap<String, String> map = new HashMap<String, String>(); map.put(ID, new String(jpost.getInt(ID)+"")); map.put(TITLE, jpost.getString(TITLE)); map.put(BODY, jpost.getString(BODY)); map.put(CREATED_AT, jpost.getString(CREATED_AT)); map.put(UPDATED_AT, jpost.getString(UPDATED_AT)); fillMaps.add(map); } } catch (JSONException e) { e.printStackTrace(); } // SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, R.layout.list_item, from, to); setListAdapter(adapter); } } |
O XML de nossa Activity (main.xml) será:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Listing posts" android:textSize="30dip"/> <ListView android:id="@android:id/android:list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@id/android:empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="Sem Posts" android:gravity="center" /> </LinearLayout> |
E o XML dos itens da lista (list_item.xml) será:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/item0" android:text="id" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <TextView android:id="@+id/item1" android:text="title" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textSize="20dip" /> <TextView android:id="@+id/item2" android:text="body" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <TextView android:id="@+id/item3" android:text="created_at" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <TextView android:id="@+id/item4" android:text="updated_at" android:layout_height="wrap_content" android:layout_width="wrap_content" /> </LinearLayout> |
Rodando nosso aplicativo, deveremos obter esta lista:
A partir de agora temos nosso Android se conectando ao nosso servidor Rails e recuperando informações dele via REST.
Ótimo Artigo, você poderia fazer um artigo de continuação como adicionar Post em um servidor Rails utilizando Android… iria ser uma ótima abordagem! Onde poderia verificar como fazer? Obrigado