
Retrofit ist eine Bibliothek, die unter Android-Entwicklern für das Networking bekannt ist. Einige halten sie sogar für einen Standard. Es gibt viele Gründe für diese Beliebtheit: Die Bibliothek unterstützt die REST-API perfekt, ist einfach zu testen und zu konfigurieren und Anforderungen über das Netzwerk werden mit ihrer Hilfe sehr einfach ausgeführt. In diesem Artikel werde ich Ihnen zeigen, wie Sie Retrofit konfigurieren und verwenden, um das Netzwerk mit Ihrer Anwendung zu implementieren.
Retrofit konfigurieren
Fügen Sie der Datei build.gradle
die folgende Abhängigkeit build.gradle
:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
Wir werden Gson verwenden , um JSON in POJO zu konvertieren. Retrofit bietet eine Abhängigkeit, die JSON automatisch in POJO konvertiert. build.gradle
Datei build.gradle
eine weitere Abhängigkeit 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 AndroidManifest
Datei die entsprechende Zeile AndroidManifest
:
<uses-permission android:name="android.permission.INTERNET"/>
Nachdem die Abhängigkeiten hinzugefügt wurden, müssen wir Code schreiben, um die Retrofit-Bibliothek zu konfigurieren.
Erstellen Sie eine Klasse namens NetworkService
:
public class NetworkService { }
Diese Klasse muss ein Singleton-Objekt sein. Deklarieren Sie daher eine statische Variable und eine Funktion, die eine Variable des gleichen Typs wie die Klasse erstellt und zurückgibt. Wenn Sie nicht wissen, wie dieses Muster funktioniert, lesen Sie diesen Artikel , der Beispiele für Implementierungen in der Java-Sprache enthält.
public class NetworkService { private static NetworkService mInstance; public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } }
Zum Testen verwenden wir den JSONPlaceholder , der Entwicklern eine gefälschte Online-REST-API bietet:
https://jsonplaceholder.typicode.com
Jetzt deklarieren und initialisieren wir Retrofit im NetworkService
Konstruktor:
public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } }
Die Konfiguration ist abgeschlossen. Jetzt müssen wir die Endpunkte ermitteln , die Daten zurückgeben.
Endpunkte hinzufügen
Erstellen Sie eine Schnittstelle mit dem Namen JSONPlaceHolderApi
:
public interface JSONPlaceHolderApi { }
Auf der JSONPlaceHolder- Site ist URL /posts/id
der Endpunkt, der eine Nachricht mit der entsprechenden Kennung zurückgibt. Dieser Endpunkt empfängt eine GET-Anforderung und gibt 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:
public class Post { @SerializedName("userId") @Expose private int userId; @SerializedName("id") @Expose private int id; @SerializedName("title") @Expose private String title; @SerializedName("body") @Expose private String body; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } }
Wie Sie sehen können, ist dies eine einfache POJO-Klasse. Wir haben die Variablen mit @SerializedName()
kommentiert und dort den Namen übergeben. Diese Namen sind tatsächlich Schlüssel in den von der API zurückgegebenen JSON-Daten. Sie können den Variablennamen also beliebig ändern. @SerializedName()
Sie jedoch sicher, dass der an die Annotation @SerializedName()
Name in JSON genau vorhanden ist.
Definieren Sie in der oben erstellten Schnittstelle die Endpunkte mit den erforderlichen Parametern:
public interface JSONPlaceHolderApi { @GET("/posts/{id}") public Call<Post> getPostWithID(@Path("id") int id); }
Da wir eine GET-Anfrage senden, müssen wir die Annotation @GET
auf die Methode anwenden, innerhalb derer sich der Endpunkt befindet, an den wir die Anfrage senden möchten. Wie Sie sehen können, fügen wir nicht die vollständige URL hinzu Beim Nachrüsten wird die an die NetworkService
Klasse übergebene BASE_URL
automatisch übernommen und dem Rest der URL hinzugefügt.
Der Rückgabetyp der Methode heißt Call<Post>
. Call
ist 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 Post
passiert, weil Dies ist genau das Objekt, in das wir die JSON-Antwort konvertieren möchten. Wir haben den Parametern eine Ganzzahl übergeben und sie mit @Path
kommentiert, in das wir id
. Retrofit nimmt diesen Wert an und ersetzt am Endpunkt {id}
diesen Wert. Wenn wir also den Wert 1 als Parameter übergeben, sieht der Endpunkt wie folgt aus: /posts/1
, wenn wir den Wert 10 übergeben, lautet der Endpunkt /posts/10
.
Jetzt benötigen wir Retrofit, um eine Implementierung der JSONPlaceHolderApi
Schnittstelle JSONPlaceHolderApi
. Verwenden Sie dazu die Methode create()
:
public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static NetworkService getInstance() { if (mInstance == null) { mInstance = new NetworkService(); } return mInstance; } public JSONPlaceHolderApi getJSONApi() { return mRetrofit.create(JSONPlaceHolderApi.class); } }
Als Nächstes müssen Sie JSONPlaceHolderApi
von NetworkService
JSONPlaceHolderApi
und eine Anfrage senden:
NetworkService.getInstance() .getJSONApi() .getPostWithID(1) .enqueue(new Callback<Post>() { @Override public void onResponse(@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"); } @Override public void onFailure(@NonNull Call<Post> call, @NonNull Throwable t) { textView.append("Error occurred while getting request!"); t.printStackTrace(); } });
Das zurückgegebene Call
Objekt enthält eine Methode namens enqueue
, die Callback<T>
als Parameter verwendet. In onResponse
wir das Ergebnis Response<Post>
das das vom Server zurückgegebene Post
Objekt enthält. Um das Post
Objekt selbst abzurufen, verwenden wir die response.body()
-Methode. Der Rest des Codes ist ohne weitere Erklärung verständlich.
Senden verschiedener Arten von Anfragen
Die JSONPlaceHolder
API verfügt über viele verschiedene Endpunkte, die Sie verwenden können.
Eine Liste der Nachrichten erhalten
@GET("/posts") public Call<List<Post>> getAllPosts();
Um eine Liste aller Nachrichten zu erhalten, haben wir den Endpunkt und den Rückgabetyp der Funktion geändert.
Anfrage mit Parameter senden
Wenn Sie eine Anforderung 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 den Wert 6 im Methodenparameter übergeben, ist der Endpunkt next - /posts?userId=6
.
Senden einer POST-Anfrage
Um eine POST-Anfrage zu senden, müssen Sie nur die Annotation der Methode ändern.
@POST("/posts") public Call<Post> postData(@Body Post data);
Um den Anforderungshauptteil für diese Methode zu bilden, verwenden wir die Annotation @Body
für den übergebenen Parameter. Retrofit verwendet Gson, um @Body
in JSON zu konvertieren.
Es gibt verschiedene Arten von Abfragen, die Sie verwenden können. Dies ist jedoch ein Thema für einen separaten Artikel.
Abfangen anfordern
Nachrüsten bietet eine Möglichkeit, Anforderungen abzufangen und bei Logcat anzumelden. Lassen Sie uns einen Abfangjäger einrichten und diese Magie betrachten. Fügen Sie der Datei build.gradle
die folgende Abhängigkeit build.gradle
:
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'
Aktualisieren Sie die NetworkService
Klasse folgendermaßen:
public class NetworkService { private static NetworkService mInstance; private static final String BASE_URL = "https://jsonplaceholder.typicode.com"; private Retrofit mRetrofit; private NetworkService() { 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(); } public static 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 Daten, einschließlich URLs, Header und Text, im Protokoll angezeigt:
D/OkHttp: <-- 200 https://jsonplaceholder.typicode.com/posts/1 (3030ms) date: Tue, 24 Apr 2018 15:25:19 GMT content-type: application/json; charset=utf-8 set-cookie: __cfduid=d16d4221ddfba20b5464e6829eed4e3d11524583519; expires=Wed, 24-Apr-19 15:25:19 GMT; path=/; domain=.typicode.com; HttpOnly x-powered-by: Express vary: Origin, Accept-Encoding access-control-allow-credentials: true cache-control: public, max-age=14400 pragma: no-cache expires: Tue, 24 Apr 2018 19:25:19 GMT 04-24 15:25:16.204 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: x-content-type-options: nosniff etag: W/"124-yiKdLzqO5gfBrJFrcdJ8Yq0LGnU" via: 1.1 vegur cf-cache-status: HIT expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" server: cloudflare cf-ray: 410994f328963066-SIN 04-24 15:25:16.246 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: { 04-24 15:25:16.247 7023-7056/com.thetehnocafe.gurleensethi.retrofitexample D/OkHttp: "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" } <-- END HTTP (292-byte body)
Damit ist unser Artikel abgeschlossen. Den Code für dieses Projekt finden Sie auf GitHub .