Centro Universitário UniBH
Ciência da Computação
Programação para WEB e Dispositivos Móveis
Professor: Lucas Schmidt
Android REST
Nesta aula, vamos trabalhar com requisições REST (HTTP/HTTPS GET E POST) via aplicação Android. Para isso, vamos consumir de API's livres e já disponíveis na internet. No entanto, nada impede a criação da nossa API própria, através de qualquer outra linguagem.
Neste exemplo, vamos trabalhar com a API disponibilizada pelo site: https://reqres.in/, que disponibiliza dados fictícios para desenvolvedores de aplicações.
Sendo assim, trabalharemos com os serviços:
https://reqres.in/api/users?page=1
https://reqres.in/api/users?page=2
https://reqres.in/api/users?page=3
https://reqres.in/api/users?page=4
que retorna informações de usuários fictícios estruturados no formato JSON, conforme exemplo abaixo:
{
"page": 2,
"per_page": 3,
"total": 12,
"total_pages": 4,
"data": [
{
"id": 4,
"email": "eve.holt@reqres.in",
"first_name": "Eve",
"last_name": "Holt",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/128.jpg"
},
{
"id": 5,
"email": "charles.morris@reqres.in",
"first_name": "Charles",
"last_name": "Morris",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/stephenmoon/128.jpg"
},
{
"id": 6,
"email": "tracey.ramos@reqres.in",
"first_name": "Tracey",
"last_name": "Ramos",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/bigmancho/128.jpg"
}
]
}
Agora, sabendo quais as estruturas vamos consumir, iniciamos a implementação da nossa aplicação Android:
Passo 1:
Crie um novo projeto Android
No novo projeto criado, acesse o arquivo build.gradle(Module: app), em Gradle Scripts e adicione a biblioteca de requisições HTTP (OkHTTP), conforme exemplo abaixo:
implementation 'com.squareup.okhttp3:okhttp:3.7.0'
Passo 2:
Altere o arquivo AndroidManifest e inclua as permissões de INTERNET e ACCESS_NETWORK_STATE:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lucasfranco.restandroid">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Passo 3:
Altere o arquivo da View activity_main e inclua um elemento de ListView, conforme exemplo abaixo:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/lista"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true" />
</android.support.constraint.ConstraintLayout>
Passo 4:
No mesmo pacote java que contém a classe MainActivity, crie duas novas classes, RestConnection e User:
Na classe RestConnection, implemente os métodos get e post, conforme apresentado abaixo:
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class RestConnection {
// Método POST HTTP
public static String post(String url, String params){
OkHttpClient client = new OkHttpClient();
Request.Builder builder = new Request.Builder();
builder.url(url);
//MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(mediaType, params);
builder.post(body);
Request request = builder.build();
try{
Response response = client.newCall(request).execute();
return response.body().string();
}catch (IOException erro){
return null;
}
}
// Método GET HTTP
public static String get(String url, String params){
OkHttpClient client = new OkHttpClient();
Request.Builder builder = new Request.Builder();
builder.url(url);
//MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(mediaType, params);
builder.get();
Request request = builder.build();
try{
Response response = client.newCall(request).execute();
return response.body().string();
}catch (IOException erro){
return null;
}
}
}
A classe User, corresponde à uma Model, e será utilizada para estruturar o conteúdo que retornará na requisição REST pelo JSON. Implemente, conforme apresentado abaixo:
public class User {
private int id;
private String email;
private String first_name;
private String last_name;
private String avatar;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
}
Passo 5:
Altere a classe MainActivity, conforme apresentado abaixo:
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// Informações do seridor (API) que será requisitada
String server = "https://reqres.in/";
String url = server + "api/users?page=2";
// Estruturas de lista
ListView lista;
ArrayAdapter adapterLista;
// Lista de usuários
List<User> users;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Recuperar instancia da lista
lista = (ListView) findViewById(R.id.lista);
//Verifica a conexão
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// Verifica o estado da rede se está conectado ou não
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
//Executando url e enviando para Solicita dados
if (networkInfo != null && networkInfo.isConnected()) {
new getDados().execute(url);
}
}
private class getDados extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls){
String params = "";
return RestConnection.get(urls[0], params);
}
@Override
protected void onPostExecute(String result){
// Instancia nova lista de Usuarios
users = new ArrayList<User>();
try {
// Recebe resultado de requisição HTTP e armazena em um JSON Array
JSONObject json = new JSONObject(result);
// Aramazena o atributo data do JSON
JSONArray jsonArray = new JSONArray(json.getString("data"));
// Cria novo obeto JSON para receber cada item do array
JSONObject itemJson;
// Percorre pelo JSON Array do resultado
for(int i = 0; i < jsonArray.length(); i++){
// Recebe cada item do array
itemJson = new JSONObject(jsonArray.getString(i));
// Cria nova instancia de Usuario
final User user = new User();
// Preenche objeto de Usuário com objetos do JSON
user.setFirst_name(itemJson.getString("first_name"));
user.setLast_name(itemJson.getString("last_name"));
user.setEmail(itemJson.getString("email"));
user.setAvatar(itemJson.getString("avatar"));
// Adiciona novo item de Usuário para a lista de usuários
users.add(user);
}
// Alimenta itens da lista de usuários ao ListView presente na View
adapterLista = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_2, android.R.id.text1, users) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView text1 = (TextView) view.findViewById(android.R.id.text1);
TextView text2 = (TextView) view.findViewById(android.R.id.text2);
text1.setText(users.get(position).getFirst_name());
text2.setText(users.get(position).getEmail());
return view;
}
};
lista.setAdapter(adapterLista);
} catch (JSONException e){
e.printStackTrace();}
}
}
}
Passo 6:
Teste o resultado!