Verwenden Sie Retrofit 2 in der Android-Anwendung

Ursprünglicher Autor: Gurleen Sethi
  • Übersetzung
  • Tutorial

Verwenden Sie Retrofit 2 in der Android-Anwendung


Retrofit ist eine unter Android-Entwicklern bekannte Netzwerkbibliothek, die in manchen Fällen sogar als Standard angesehen wird. Es gibt viele Gründe für diese Beliebtheit: Die Bibliothek unterstützt perfekt die REST-API, ist einfach zu testen und zu konfigurieren, und Anfragen über das Netzwerk mit ihrer Hilfe sind absolut einfach. In diesem Artikel werde ich Ihnen zeigen, wie Sie Retrofit konfigurieren und verwenden, um Netzwerke in Ihrer Anwendung zu implementieren.


Setup nachrüsten


Fügen Sie der Datei die folgende Abhängigkeit hinzu build.gradle:


implementation 'com.squareup.retrofit2:retrofit:2.4.0'

Wir werden Gson verwenden , um JSON in POJO umzuwandeln. Retrofit stellt eine Abhängigkeit bereit, die JSON automatisch in POJO konvertiert. Fügen Sie dazu der Datei eine weitere Abhängigkeit hinzu build.gradle:


implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

Wenn Ihre Anwendung noch nicht mit dem Netzwerk arbeiten darf, fügen Sie der Datei die entsprechende Zeile hinzu AndroidManifest:


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

Nachdem die Abhängigkeiten hinzugefügt wurden, müssen wir Code schreiben, um die Retrofit-Bibliothek anzupassen.


Erstellen Sie eine Klasse mit dem Namen NetworkService:


publicclassNetworkService{
}

Diese Klasse muss ein Singleton-Objekt sein. Deklarieren Sie daher eine statische Variable und eine Funktion, die eine Variable vom gleichen Typ wie die Klasse erstellt und zurückgibt. Wenn Sie nicht wissen, wie dieses Muster funktioniert, lesen Sie diesen Artikel , der Beispiele für die Implementierung in der Java-Sprache enthält.


publicclassNetworkService{
    privatestatic NetworkService mInstance;
    publicstatic NetworkService getInstance(){
        if (mInstance == null) {
            mInstance = new NetworkService();
        }
        return mInstance;
    }
}

Zum Testen verwenden wir den JSONPlaceholder , der eine gefälschte Online-REST-API für Entwickler bereitstellt:


https://jsonplaceholder.typicode.com

Nun werden wir das Retrofit im Konstruktor deklarieren und initialisieren NetworkService:


publicclassNetworkService{
    privatestatic NetworkService mInstance;
    privatestaticfinal String BASE_URL = "https://jsonplaceholder.typicode.com";
    private Retrofit mRetrofit;
    privateNetworkService(){
        mRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    publicstatic NetworkService getInstance(){
        if (mInstance == null) {
            mInstance = new NetworkService();
        }
        return mInstance;
    }
}

Das Setup ist abgeschlossen. Nun müssen wir die Endpunkte definieren, die Daten zurückgeben.


Endpunkte hinzufügen


Erstellen Sie eine Schnittstelle mit dem Namen JSONPlaceHolderApi:


publicinterfaceJSONPlaceHolderApi{
}

Auf der JSONPlaceHolder- Website ist die URL /posts/idder Endpunkt, der eine Nachricht mit der entsprechenden ID zurückgibt. Dieser Endpunkt akzeptiert eine GET-Anforderung und gibt die Daten im JSON-Format wie folgt zurück:


{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}

Zuerst erstellen wir das entsprechende POJO für die JSON-Antwort:


publicclassPost{
    @SerializedName("userId")
    @Exposeprivateint userId;
    @SerializedName("id")
    @Exposeprivateint id;
    @SerializedName("title")
    @Exposeprivate String title;
    @SerializedName("body")
    @Exposeprivate String body;
    publicintgetUserId(){
        return userId;
    }
    publicvoidsetUserId(int userId){
        this.userId = userId;
    }
    publicintgetId(){
        return id;
    }
    publicvoidsetId(int id){
        this.id = id;
    }
    public String getTitle(){
        return title;
    }
    publicvoidsetTitle(String title){
        this.title = title;
    }
    public String getBody(){
        return body;
    }
    publicvoidsetBody(String body){
        this.body = body;
    }
}

Wie Sie sehen, ist dies eine einfache POJO-Klasse. Variablen, mit denen wir Anmerkungen gemacht haben @SerializedName(), die den Namen dort übergeben. Diese Namen sind eigentlich Schlüssel in den von der API zurückgegebenen JSON-Daten. Sie können also den Namen der Variablen beliebig ändern. Stellen Sie jedoch sicher, dass der an die Annotation übergebene Name @SerializedName()in JSON genau vorhanden ist.


Definieren Sie in der oben erstellten Schnittstelle die Endpunkte mit den erforderlichen Parametern:


publicinterfaceJSONPlaceHolderApi{
    @GET("/posts/{id}")
    public Call<Post> getPostWithID(@Path("id")int id);
}

Da wir eine GET-Anfrage senden, müssen wir der Methode eine Anmerkung hinzufügen @GET, in der sich ein Endpunkt befindet, an den wir eine Anfrage senden möchten. Wie Sie sehen, fügen wir nicht die vollständige URL hinzu, weil Retrofit übernimmt automatisch die BASE_URLübergebene Klasse NetworkServiceund fügt sie dem Rest der URL hinzu.


Der Rückgabetyp der Methode wird aufgerufen Call<Post>. CallIst eine Klasse, die direkt von der Bibliothek selbst bereitgestellt wird. Alle Methoden in der Schnittstelle sollten Werte dieses Typs zurückgeben. Dies ist eine generische Klasse, die den Objekttyp akzeptiert, den wir in JSON konvertieren möchten. Wir haben bestanden Post, weil Dies ist genau das Objekt, in das die JSON-Antwort konvertiert werden soll. Wir haben den Parametern eine Ganzzahl übergeben und diese mit der Hilfe versehen, @Pathin der wir sie geschrieben haben id. Retrofit übernimmt diesen Wert und ersetzt ihn am Endpunkt {id}. Wenn wir also den Wert 1 als Parameter übergeben, wird der Endpunkt folgendermaßen aussehen: /posts/1Wenn wir den Wert 10 übergeben, wird der Endpunkt als - ausfallen /posts/10.


Jetzt benötigen wir Retrofit, um eine Schnittstellenimplementierung bereitzustellen JSONPlaceHolderApi. Dafür verwenden wir die Methode create():


publicclassNetworkService{
    privatestatic NetworkService mInstance;
    privatestaticfinal String BASE_URL = "https://jsonplaceholder.typicode.com";
    private Retrofit mRetrofit;
    privateNetworkService(){
        mRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    publicstatic NetworkService getInstance(){
        if (mInstance == null) {
            mInstance = new NetworkService();
        }
        return mInstance;
    }
    public JSONPlaceHolderApi getJSONApi(){
        return mRetrofit.create(JSONPlaceHolderApi.class);
    }
}

Als nächstes müssen Sie erhalten JSONPlaceHolderApiaus NetworkServiceder Anfrage und senden:


NetworkService.getInstance()
                .getJSONApi()
                .getPostWithID(1)
                .enqueue(new Callback<Post>() {
                    @OverridepublicvoidonResponse(@NonNull Call<Post> call, @NonNull Response<Post> response){
                        Post post = response.body();
                        textView.append(post.getId() + "\n");
                        textView.append(post.getUserId() + "\n");
                        textView.append(post.getTitle() + "\n");
                        textView.append(post.getBody() + "\n");
                    }
                    @OverridepublicvoidonFailure(@NonNull Call<Post> call, @NonNull Throwable t){
                        textView.append("Error occurred while getting request!");
                        t.printStackTrace();
                    }
                });

Das zurückgegebene Objekt Callenthält eine Methode mit einem Namen enqueue, der als Parameter verwendet wird Callback<T>. Wie onResponsebekommen wir ein Ergebnis , Response<Post>das ein Objekt vom Server zurück enthält Post. Um das Objekt selbst zu erhalten Post, verwenden Sie die Methode response.body(). Der Rest des Codes ist ohne weitere Erklärung klar.


Senden verschiedener Arten von Anfragen


Die API JSONPlaceHolderverfügt über viele verschiedene Endpunkte, die Sie verwenden können.


Liste der Nachrichten abrufen


@GET("/posts")
public Call<List<Post>> getAllPosts();

Um eine Liste aller Meldungen zu erhalten, haben wir den Endpunkt und den Rückgabetyp der Funktion geändert.


Sendeanforderung mit Parameter


Wenn Sie eine Anfrage mit einem Parameter senden möchten, müssen Sie nur die Annotation @Query()für den entsprechenden Parameter in der Methode verwenden:


@GET("/posts")
public Call<List<Post>> getPostOfUser(@Query("userId") int id);

Wenn wir also im Methodenparameter den Wert 6 übergeben, ist der Endpunkt next - /posts?userId=6.


Senden einer POST-Anfrage


Um eine POST-Anforderung zu senden, müssen Sie nur die Annotation der Methode ändern.


@POST("/posts")
public Call<Post> postData(@Body Post data);

Um den Anforderungstext für diese Methode zu bilden, verwenden wir die Annotation @Bodyfür den übergebenen Parameter. Retrofit verwendet Gson zur Konvertierung @Bodyin JSON.


Es gibt verschiedene andere Arten von Abfragen, die Sie verwenden können. Dies ist jedoch ein Thema für einen separaten Artikel.


Anfragen abfangen


Retrofit bietet die Möglichkeit, Anforderungen zu erfassen und in Logcat zu protokollieren. Lassen Sie uns einen Abfangjäger einrichten und diese Magie betrachten. Fügen Sie der Datei die folgende Abhängigkeit hinzu build.gradle:


implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'

Aktualisieren Sie die Klasse folgendermaßen NetworkService:


publicclassNetworkService{
    privatestatic NetworkService mInstance;
    privatestaticfinal String BASE_URL = "https://jsonplaceholder.typicode.com";
    private Retrofit mRetrofit;
    privateNetworkService(){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient.Builder client = new OkHttpClient.Builder()
                .addInterceptor(interceptor);
        mRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client.build())
                .build();
    }
    publicstatic NetworkService getInstance(){
        if (mInstance == null) {
            mInstance = new NetworkService();
        }
        return mInstance;
    }
    public JSONPlaceHolderApi getJSONApi(){
        return mRetrofit.create(JSONPlaceHolderApi.class);
    }
}

Wenn Sie jetzt eine Anfrage senden oder empfangen, werden alle ihre Daten, einschließlich URLs, Kopfzeilen und Text, im Protokoll angezeigt:


D/OkHttp: <--200https://jsonplaceholder.typicode.com/posts/1 (3030ms)
    date:Tue, 24Apr201815:25:19GMTcontent-type:application/json; charset=utf-8set-cookie:__cfduid=d16d4221ddfba20b5464e6829eed4e3d11524583519;expires=Wed,24-Apr-1915:25:19GMT; path=/;domain=.typicode.com;HttpOnlyx-powered-by:Expressvary:Origin, Accept-Encodingaccess-control-allow-credentials:truecache-control:public, max-age=14400pragma:no-cacheexpires:Tue, 24Apr201819:25:19GMT04-2415:25:16.2047023-7056/com.thetehnocafe.gurleensethi.retrofitexampleD/OkHttp:x-content-type-options:nosniffetag:W/"124-yiKdLzqO5gfBrJFrcdJ8Yq0LGnU"
    via:1.1vegurcf-cache-status:HITexpect-ct:max-age=604800,report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"server:cloudflarecf-ray:410994f328963066-SIN04-2415:25:16.2467023-7056/com.thetehnocafe.gurleensethi.retrofitexampleD/OkHttp: {
04-2415:25:16.2477023-7056/com.thetehnocafe.gurleensethi.retrofitexampleD/OkHttp:   "userId":1,
      "id":1,
      "title": "suntautfacererepellatprovidentoccaecatiexcepturioptioreprehenderit",
      "body": "quiaetsuscipit\nsuscipitrecusandaeconsequunturexpeditaetcum\nreprehenderitmolestiaeututquastotam\nnostrumrerumestautemsuntremevenietarchitecto"
    }
    <--ENDHTTP (292-bytebody)

Hier endet unser Artikel. Den Code für dieses Projekt finden Sie auf GitHub .


Jetzt auch beliebt: