Retrofit Android Beispiel Tutorial

Willkommen zum Retrofit Android Beispiel Tutorial. Heute werden wir die von Square entwickelte Retrofit-Bibliothek verwenden, um REST-API-Aufrufe in unserer Android-Anwendung zu verarbeiten.

Retrofit Android

Retrofit ist ein typsicherer REST-Client für Android und Java, der darauf abzielt, das Konsumieren von RESTful-Webservices zu erleichtern. Wir werden nicht auf die Details der Retrofit 1.x-Versionen eingehen und direkt zu Retrofit 2 übergehen, das viele neue Funktionen und eine geänderte interne API im Vergleich zu den vorherigen Versionen aufweist. Retrofit 2 nutzt standardmäßig OkHttp als Netzwerkschicht und ist darauf aufgebaut. Retrofit serialisiert automatisch die JSON-Antwort mithilfe eines POJO (Plain Old Java Object), das im Voraus für die JSON-Struktur definiert werden muss. Um JSON zu serialisieren, benötigen wir einen Konverter, um es zuerst in Gson umzuwandeln. Wir müssen die folgenden Abhängigkeiten zu unserer build.grade-Datei hinzufügen.

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

Die OkHttp-Abhängigkeit ist bereits mit der Retrofit 2-Abhängigkeit ausgeliefert. Wenn Sie eine separate OkHttp-Abhängigkeit verwenden möchten, sollten Sie die OkHttp-Abhängigkeit von Retrofit 2 ausschließen, wie folgt:

compile ('com.squareup.retrofit2:retrofit:2.1.0') {  
  // Ausschließen der OkHttp-Abhängigkeitsmodule von Retrofit und Definition des eigenen Modulsimports
  exclude module: 'okhttp'
}
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.squareup.okhttp3:okhttps:3.4.1'
  • Der Logging-Interceptor generiert einen Protokollstring der gesamten Antwort, die zurückgegeben wird.
  • Es gibt auch andere Konverter, um das JSON in den erforderlichen Typ zu parsen. Einige von ihnen sind unten aufgeführt.
  1. Jackson : com.squareup.retrofit2:converter-jackson:2.1.0
  2. Moshi : com.squareup.retrofit2:converter-moshi:2.1.0
  3. Protobuf : com.squareup.retrofit2:converter-protobuf:2.1.0
  4. Wire : com.squareup.retrofit2:converter-wire:2.1.0
  5. Simple XML : com.squareup.retrofit2:converter-simplexml:2.1.0

Füge die Berechtigung zum Zugriff auf das Internet in der Datei AndroidManifest.xml hinzu.

OkHttp Interceptors

Interceptors sind ein leistungsstarker Mechanismus in OkHttp, der Anrufe überwachen, neu schreiben und wiederholen kann. Interceptors können hauptsächlich in zwei Kategorien unterteilt werden:

  • Application Interceptors : Um einen Application Interceptor zu registrieren, müssen wir addInterceptor() auf OkHttpClient.Builder aufrufen
  • Network Interceptors : Um einen Network Interceptor zu registrieren, rufen Sie addNetworkInterceptor() anstelle von addInterceptor() auf

Einrichten des Retrofit Interface

package com.journaldev.retrofitintro;

import com.journaldev.retrofitintro.pojo.MultipleResource;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

class APIClient {

    private static Retrofit retrofit = null;

    static Retrofit getClient() {

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();


        retrofit = new Retrofit.Builder()
                .baseUrl("https://reqres.in")
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();



        return retrofit;
    }

}

Die getClient()-Methode im obigen Code wird jedes Mal aufgerufen, wenn eine Retrofit-Schnittstelle eingerichtet wird. Retrofit bietet eine Liste von Annotationen für jeden der HTTP-Methoden: @GET, @POST, @PUT, @DELETE, @PATCH oder @HEAD. Schauen wir uns an, wie unsere Klasse APIInterface.java aussieht.

package com.journaldev.retrofitintro;

import com.journaldev.retrofitintro.pojo.MultipleResource;
import com.journaldev.retrofitintro.pojo.User;
import com.journaldev.retrofitintro.pojo.UserList;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

interface APIInterface {

    @GET("/api/unknown")
    Call<MultipleResource> doGetListResources();

    @POST("/api/users")
    Call<User> createUser(@Body User user);

    @GET("/api/users?")
    Call<UserList> doGetUserList(@Query("page") String page);

    @FormUrlEncoded
    @POST("/api/users?")
    Call<UserList> doCreateUserWithField(@Field("name") String name, @Field("job") String job);
}

In der obigen Klasse haben wir einige Methoden definiert, die HTTP-Anfragen mit Annotationen durchführen. @GET("/api/unknown") ruft doGetListResources(); auf. doGetListResources() ist der Methodenname. MultipleResource.java ist eine Modell-POJO-Klasse für unser Antwortobjekt, das verwendet wird, um die Antwortparameter ihren jeweiligen Variablen zuzuordnen. Diese POJO-Klassen fungieren als Rückgabetyp der Methode. Eine einfache POJO-Klasse für MultipleResources.java ist unten angegeben.

package com.journaldev.retrofitintro.pojo;

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.List;

public class MultipleResource {

    @SerializedName("page")
    public Integer page;
    @SerializedName("per_page")
    public Integer perPage;
    @SerializedName("total")
    public Integer total;
    @SerializedName("total_pages")
    public Integer totalPages;
    @SerializedName("data")
    public List<Datum> data = null;

    public class Datum {

        @SerializedName("id")
        public Integer id;
        @SerializedName("name")
        public String name;
        @SerializedName("year")
        public Integer year;
        @SerializedName("pantone_value")
        public String pantoneValue;

    }
}

Die Annotation @SerializedName wird verwendet, um den Namen des Feldes anzugeben, der in der JSON-Antwort steht. Vorschau der POJO-Klasse und kopieren Sie sie in Ihre Android Studio-Projektstruktur. Die POJO-Klassen sind in eine typisierte Retrofit-Call-Klasse eingebettet. Hinweis: Ein JSONArray wird als Liste von Objekten in den POJO-Klassen serialisiert. Methodenparameter: Es gibt eine Vielzahl möglicher Optionen von Parametern, die innerhalb einer Methode übergeben werden können:

  • @Body – Sendet Java-Objekte als Anforderungskörper.
  • @Url – Verwendet dynamische URLs.
  • @Query – Wir können einfach einen Methodenparameter mit @Query und einem Abfrageparameter-Namen hinzufügen, der den Typ beschreibt. Um eine Abfrage zu URL-kodieren, verwenden Sie das Formular: @Query(value = "auth_token",encoded = true) String auth_token
  • @Field – senden Sie Daten als form-urlencoded. Dafür ist eine @FormUrlEncoded-Annotation erforderlich, die mit der Methode verbunden ist. Der @Field-Parameter funktioniert nur mit einem POST

Hinweis: @Field erfordert einen obligatorischen Parameter. In Fällen, in denen @Field optional ist, können wir stattdessen @Query verwenden und einen Nullwert übergeben.

Retrofit Android Beispielprojektstruktur

Das pojo-Paket definiert vier Modellklassen für jede der in der Klasse APIInterface.java definierten API-Endpunkte. User.java

package com.journaldev.retrofitintro.pojo;

import com.google.gson.annotations.SerializedName;

public class User {

    @SerializedName("name")
    public String name;
    @SerializedName("job")
    public String job;
    @SerializedName("id")
    public String id;
    @SerializedName("createdAt")
    public String createdAt;

    public User(String name, String job) {
        this.name = name;
        this.job = job;
    }


}

Die obige Klasse wird verwendet, um den Antwortkörper für die Methode createUser() zu erstellen. UserList.java

package com.journaldev.retrofitintro.pojo;

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.List;

public class UserList {

    @SerializedName("page")
    public Integer page;
    @SerializedName("per_page")
    public Integer perPage;
    @SerializedName("total")
    public Integer total;
    @SerializedName("total_pages")
    public Integer totalPages;
    @SerializedName("data")
    public List<Datum> data = new ArrayList();

    public class Datum {

        @SerializedName("id")
        public Integer id;
        @SerializedName("first_name")
        public String first_name;
        @SerializedName("last_name")
        public String last_name;
        @SerializedName("avatar")
        public String avatar;

    }
}

CreateUserResponse.java

package com.journaldev.retrofitintro.pojo;

import com.google.gson.annotations.SerializedName;

public class CreateUserResponse {

    @SerializedName("name")
    public String name;
    @SerializedName("job")
    public String job;
    @SerializedName("id")
    public String id;
    @SerializedName("createdAt")
    public String createdAt;
}

Die MainActivity.java ist der Ort, an dem wir jeden der in der Interface-Klasse definierten API-Endpunkte aufrufen und jedes der Felder in einem Toast/TextView anzeigen.

package com.journaldev.retrofitintro;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.journaldev.retrofitintro.pojo.CreateUserResponse;
import com.journaldev.retrofitintro.pojo.MultipleResource;
import com.journaldev.retrofitintro.pojo.User;
import com.journaldev.retrofitintro.pojo.UserList;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {

    TextView responseText;
    APIInterface apiInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        responseText = (TextView) findViewById(R.id.responseText);
        apiInterface = APIClient.getClient().create(APIInterface.class);


        /**
         GET List Resources
         **/
        Call<MultipleResource> call = apiInterface.doGetListResources();
        call.enqueue(new Callback<MultipleResource>() {
            @Override
            public void onResponse(Call<MultipleResource> call, Response<MultipleResource> response) {


                Log.d("TAG",response.code()+"");

                String displayResponse = "";

                MultipleResource resource = response.body();
                Integer text = resource.page;
                Integer total = resource.total;
                Integer totalPages = resource.totalPages;
                List<MultipleResource.Datum> datumList = resource.data;

                displayResponse += text + " Page\n" + total + " Total\n" + totalPages + " Total Pages\n";

                for (MultipleResource.Datum datum : datumList) {
                    displayResponse += datum.id + " " + datum.name + " " + datum.pantoneValue + " " + datum.year + "\n";
                }

                responseText.setText(displayResponse);

            }

            @Override
            public void onFailure(Call<MultipleResource> call, Throwable t) {
                call.cancel();
            }
        });

        /**
         Create new user
         **/
        User user = new User("morpheus", "leader");
        Call<User> call1 = apiInterface.createUser(user);
        call1.enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                User user1 = response.body();

                Toast.makeText(getApplicationContext(), user1.name + " " + user1.job + " " + user1.id + " " + user1.createdAt, Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
                call.cancel();
            }
        });

        /**
         GET List Users
         **/
        Call<UserList> call2 = apiInterface.doGetUserList("2");
        call2.enqueue(new Callback<UserList>() {
            @Override
            public void onResponse(Call<UserList> call, Response<UserList> response) {

                UserList userList = response.body();
                Integer text = userList.page;
                Integer total = userList.total;
                Integer totalPages = userList.totalPages;
                List<UserList.Datum> datumList = userList.data;
                Toast.makeText(getApplicationContext(), text + " page\n" + total + " total\n" + totalPages + " totalPages\n", Toast.LENGTH_SHORT).show();

                for (UserList.Datum datum : datumList) {
                    Toast.makeText(getApplicationContext(), "id : " + datum.id + " name: " + datum.first_name + " " + datum.last_name + " avatar: " + datum.avatar, Toast.LENGTH_SHORT).show();
                }


            }

            @Override
            public void onFailure(Call<UserList> call, Throwable t) {
                call.cancel();
            }
        });


        /**
         POST name and job Url encoded.
         **/
        Call<UserList> call3 = apiInterface.doCreateUserWithField("morpheus","leader");
        call3.enqueue(new Callback<UserList>() {
            @Override
            public void onResponse(Call<UserList> call, Response<UserList> response) {
                UserList userList = response.body();
                Integer text = userList.page;
                Integer total = userList.total;
                Integer totalPages = userList.totalPages;
                List<UserList.Datum> datumList = userList.data;
                Toast.makeText(getApplicationContext(), text + " page\n" + total + " total\n" + totalPages + " totalPages\n", Toast.LENGTH_SHORT).show();

                for (UserList.Datum datum : datumList) {
                    Toast.makeText(getApplicationContext(), "id : " + datum.id + " name: " + datum.first_name + " " + datum.last_name + " avatar: " + datum.avatar, Toast.LENGTH_SHORT).show();
                }

            }

            @Override
            public void onFailure(Call<UserList> call, Throwable t) {
                call.cancel();
            }
        });

    }
}

apiInterface = APIClient.getClient().create(APIInterface.class); wird verwendet, um den APIClient zu instanziieren. Um die Modellklasse der Antwort zuzuordnen, verwenden wir: MultipleResource resource = response.body(); Das Ausführen der Anwendung würde jeden der Endpunkte aufrufen und eine entsprechende Toast-Nachricht für sie anzeigen. Damit endet das Retrofit-Android-Beispiel-Tutorial. Sie können das Android Retrofit-Beispielprojekt über den folgenden Link herunterladen.

Retrofit Android Beispielprojekt herunterladen

Source:
https://www.digitalocean.com/community/tutorials/retrofit-android-example-tutorial