Verwenden von Retrofit 2 in einer Android-App

Verwenden von Retrofit 2 in einer Android-App


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 .

Source: https://habr.com/ru/post/de429058/


All Articles