Tutoriel d’exemple OkHttp Android

OkHttp est une bibliothèque tierce qui a été introduite par Square en 2013 pour l’envoi et la réception de requêtes réseau basées sur HTTP.

OkHttp Android

Au départ, Android avait seulement deux clients HTTP : HttpURLConnection et Apache HTTP Client; pour l’envoi et la réception de données depuis le web. Chacun de ces clients nécessitait beaucoup de code de base à écrire à l’intérieur de la classe AsyncTask ou des méthodes de thread en arrière-plan. De plus, ces clients ont leurs propres ensembles de limitations en ce qui concerne l’annulation d’une requête HTTP ou le pool de connexions. OkHttp Android fournit une implémentation des interfaces HttpURLConnection et Apache Client en travaillant directement sur une instance de Socket Java sans utiliser de dépendances supplémentaires.

Avantages d’OkHttp Android

Certains avantages qu’OkHttp nous apporte sont :

  1. Pooling de connexions
  2. Compression Gzip
  3. Mise en cache
  4. Récupération des problèmes réseau
  5. Redirections
  6. Essais de
  7. Support pour les appels synchrones et asynchrones

Appels synchrones vs asynchrones

  • Les appels synchrones nécessitent un wrapper AsyncTask autour d’eux. Cela signifie qu’ils ne prennent pas en charge l’annulation d’une demande. De plus, les AsyncTasks ont tendance à divulguer le contexte de l’activité, ce qui n’est pas souhaitable.
  • L’appel asynchrone est la méthode recommandée car elle prend en charge l’annulation native, l’étiquetage de plusieurs demandes et l’annulation de toutes avec un seul appel de méthode (en invoquant l’annulation sur l’instance de l’activité à l’intérieur de la méthode onPause ou onDestroy).

Avant d’examiner la mise en œuvre d’OkHttp android, ajoutez la dépendance suivante

compile 'com.squareup.okhttp3:okhttps:3.4.1'

Ajoutez l’autorisation pour Internet à l’intérieur du fichier AndroidManifest.xml.

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

Code d’exemple OkHttp Android

Le MainActivity.java pour les appels synchrones est donné ci-dessous.

package com.journaldev.okhttp;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    OkHttpClient client = new OkHttpClient();

    TextView txtString;

    public String url= "https://reqres.in/api/users/2";


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

        txtString= (TextView)findViewById(R.id.txtString);

        OkHttpHandler okHttpHandler= new OkHttpHandler();
        okHttpHandler.execute(url);
    }

    public class OkHttpHandler extends AsyncTask {

        OkHttpClient client = new OkHttpClient();

        @Override
        protected String doInBackground(String...params) {

            Request.Builder builder = new Request.Builder();
            builder.url(params[0]);
            Request request = builder.build();

            try {
                Response response = client.newCall(request).execute();
                return response.body().string();
            }catch (Exception e){
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            txtString.setText(s);
        }
    }

}

Pour les appels asynchrones, le MainActivity.java devrait être défini comme suit:

package com.journaldev.okhttp;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {
    
    TextView txtString;
    public String url= "https://reqres.in/api/users/2";

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

        txtString= (TextView)findViewById(R.id.txtString);

        try {
            run();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    void run() throws IOException {

        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url(url)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                final String myResponse = response.body().string();

                MainActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        txtString.setText(myResponse);
                    }
                });

            }
        });
    }

}

Nous avons utilisé une API de test depuis ici. La chaîne de réponse renvoyée est au format JSON qui s’affiche à l’écran. Vous pouvez essayer d’autres API open source comme l’API Github, Stackoverflow, etc.

Exemple de paramètres de requête OkHttp

Si des paramètres de requête existent, nous pouvons facilement les transmettre en utilisant la classe HttpUrl.Builder.

HttpUrl.Builder urlBuilder = HttpUrl.parse("https://httpbin.org/get).newBuilder();
urlBuilder.addQueryParameter("website", "www.journaldev.com");
urlBuilder.addQueryParameter("tutorials", "android");
String url = urlBuilder.build().toString();

Request request = new Request.Builder()
                     .url(url)
                     .build();

L’URL ci-dessus a été obtenue depuis https://resttesttest.com/.

Exemple d’en-têtes OkHttp Android

Si des paramètres de requête authentifiés existent, ils peuvent être ajoutés sous forme d’en-têtes comme indiqué ci-dessous:

Request request = new Request.Builder()
    .header("Authorization", "replace this text with your token")
    .url("your api url")
    .build();

Traitement de la réponse JSON

Nous pouvons analyser les données JSON pour obtenir les paramètres pertinents et les afficher dans un TextView comme le code ci-dessous.

client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                final String myResponse = response.body().string();

                MainActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {

                            JSONObject json = new JSONObject(myResponse);
                            txtString.setText(json.getJSONObject("data").getString("first_name")+ " "+json.getJSONObject("data").getString("last_name"));
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });

            }
        });

Exemple de POST OkHttp Android

Jusqu’à présent, nous avons examiné comment obtenir une réponse en appelant quelques API. Pour envoyer des données au serveur, nous devons construire notre demande de la manière suivante.

public class MainActivity extends AppCompatActivity {

    public String postUrl= "https://reqres.in/api/users/";
    public String postBody="{\n" +
            "    \"name\": \"morpheus\",\n" +
            "    \"job\": \"leader\"\n" +
            "}";

    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

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

        try {
            postRequest(postUrl,postBody);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    void postRequest(String postUrl,String postBody) throws IOException {

        OkHttpClient client = new OkHttpClient();

        RequestBody body = RequestBody.create(JSON, postBody);

        Request request = new Request.Builder()
                .url(postUrl)
                .post(body)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                call.cancel();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d("TAG",response.body().string());
            }
        });
    }
}

Dans le code ci-dessus, nous avons utilisé la classe MediaType qui fait partie d’OkHttp pour définir le type de données transmises. Nous avons utilisé l’URL de l’API de test à partir de https://reqres.in/. La méthode post(RequestBody body) est appelée sur le RequestBuilder avec la valeur pertinente. Le journal affiche la réponse suivante. {"name":"morpheus","job":"leader","id":"731","createdAt":"2017-01-03T17:26:05.158Z"}. OkHttp est le HttpClient recommandé utilisé à l’intérieur de la bibliothèque de mise en réseau Retrofit. Nous examinerons cela dans le prochain tutoriel. Nous avons ajouté trois boutons dans la mise en page pour invoquer chacune des méthodes, postRequest(), run() et la classe d’encapsulation AsyncTask. Vous pouvez télécharger le projet Android OkHttp final à partir du lien ci-dessous.

Télécharger le projet d’exemple Android OkHttp

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