Consumiendo datos con Retrofit

En un video anterior vimos como utilizar Volley para traer datos desde una REST API , en este caso vamos a utilizar Retrofit para hacer exactamente lo mismo, con la diferencia que es una herramienta mas ordenada y tiene muchísimas ventajas a la hora de hacer querys y consultar mas datos que nos van a beneficiar a la hora de solicitar mas datos a nuestra api.

Lo primero que vamos a hacer es entrar a la siguiente dirección donde veremos los datos que vamos a solicitar luego

https://jsonplaceholder.typicode.com/posts

Yo utilizo una extension de chrome que se llama JSONView, la pueden descargar del siguiente enlace

https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc

Esto les va a permitir ver estructurado el JSON de una mejor manera en su navegador.

Android Studio

A continuación veremos que tenemos los siguientes atributos para cada objeto JSON

Para obtener esta informacion vamos a tener que crear un POJO en Android Studio donde crearemos para cada tipo de dato una variable con el mismo nombre que en el JSON que nos entrega la web

Posts.class

public class Posts {

private int userId;
private int id;
private String title;
private String body;


public int getUserId() {
return userId;
}

public int getId() {
return id;
}

public String getTitle() {
return title;
}

public String getBody() {
return body;
}
}

A continuación vamos a crear una interface donde vamos a utilizar la etiqueta @GET que nos ofrece retrofit para traer los datos de la web

JsonPlaceHolderApi.class

public interface JsonPlaceHolderApi {

@GET("posts")
Call<List<Posts>> getPosts();
}

El @GET(“posts”) define que queremos obtener información de la api , en este caso de la sección posts, escribimos posts dentro de get y tiene que coincidir con el nombre donde vamos a solicitar los datos en nuestra pagina

https://jsonplaceholder.typicode.com/posts

La primera seccion de la web la vamos a definir mas adelante en el MainActivity.class

MainActivity.class

public class MainActivity extends AppCompatActivity {

private TextView mJsonTxtView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mJsonTxtView = findViewById(R.id.jsonText);
getPosts();
}


private void getPosts(){

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();

JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);

Call<List<Posts>> call = jsonPlaceHolderApi.getPosts();

call.enqueue(new Callback<List<Posts>>() {
@Override
public void onResponse(Call<List<Posts>> call, Response<List<Posts>> response) {

if(!response.isSuccessful()){
mJsonTxtView.setText("Codigo: "+response.code());
return;
}

List<Posts> postsList = response.body();

for(Posts post: postsList){
String content = "";
content += "userId:"+ post.getUserId() + "\n";
content += "id:"+ post.getId() + "\n";
content += "title:"+ post.getTitle() + "\n";
content += "body:"+ post.getBody() + "\n\n";
mJsonTxtView.append(content);

}


}

@Override
public void onFailure(Call<List<Posts>> call, Throwable t) {
mJsonTxtView.setText(t.getMessage());

}
});

}
}
.baseUrl("https://jsonplaceholder.typicode.com/")

Es el encargado de definir la BASE_URL de donde vamos a ir a buscar los datos, tiene que terminar si o si con un dash / o de lo contrario nos va a arrojar un error a la hora de compilar, esto se debe a que luego de esa / el @GET("posts") que escribimos anteriormente le sumara a esa url la palabra posts para ir a esa direccion a traer los datos.


activity_main.xml

<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">

<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/jsonText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</android.support.v4.widget.NestedScrollView>






</android.support.constraint.ConstraintLayout>

Este activity solo muestra todos los datos en un TextView que traeremos de la API .

Por último algo muy importante es agregar el permiso de internet en nuestro AndroidManifest.xml , de lo contrario, no vamos a poder solicitar ningún dato

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

Para finalizar, pueden ver el siguiente video tutorial donde se explica toda la implementación de este tutorial.