OkHttp Android Voorbeeld Tutorial

OkHttp is een externe bibliotheek die in 2013 is geïntroduceerd door Square voor het verzenden en ontvangen van HTTP-gebaseerde netwerkverzoeken.

OkHttp Android

In eerste instantie had Android slechts twee HTTP-clients: HttpURLConnection en Apache HTTP Client; voor het verzenden en ontvangen van gegevens van het web. Elk van deze clients vereiste veel standaardcode die moest worden geschreven binnen de AsyncTask of de achtergrondthread-methoden. Bovendien hebben deze clients hun eigen reeks beperkingen als het ging om het annuleren van een HTTP-verzoek of het beheren van connectiepools. OkHttp android biedt een implementatie van HttpURLConnection en Apache Client interfaces door rechtstreeks te werken op een java Socket zonder extra afhankelijkheden te gebruiken.

Voordelen van OkHttp Android

Enkele voordelen die OkHttp ons biedt zijn:

  1. Connectiebeheer
  2. Gziping
  3. Caching
  4. Herstel van netwerkproblemen
  5. Redirects
  6. Herpogingen
  7. Ondersteuning voor synchrone en asynchrone oproepen

Synchrone vs Asynchrone oproepen

  • Synchrone oproepen vereisen een AsyncTask-wrapper eromheen. Dat betekent dat het annuleren van een verzoek niet wordt ondersteund. Bovendien lekken AsyncTasks over het algemeen de context van de activiteit, wat niet de voorkeur heeft.
  • Asynchrone aanroep is de aanbevolen manier, omdat het native annuleren ondersteunt, meerdere verzoeken kan taggen en ze allemaal kan annuleren met één methodeoproep (door de annulering op de activiteitsinstantie binnen de onPause of onDestroy methode te activeren).

Voordat we naar de implementatie van OkHttp voor Android kijken, voeg de volgende afhankelijkheid toe

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

Voeg de toestemming voor internet toe in het AndroidManifest.xml-bestand.

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

OkHttp Android Voorbeeldcode

De MainActivity.java voor synchrone oproepen wordt hieronder gegeven.

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);
        }
    }

}

Voor asynchrone oproepen moet de MainActivity.java als volgt worden gedefinieerd:

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);
                    }
                });

            }
        });
    }

}

We hebben een test-API gebruikt van hier. De response string die wordt geretourneerd is in JSON-formaat en wordt op het scherm afgedrukt. Je kunt andere open source API’s uitproberen zoals de Github API, Stackoverflow, enz.

Voorbeeld van OkHttp Query Parameters

Als er query parameters zijn, kunnen we deze gemakkelijk doorgeven met behulp van een HttpUrl.Builder-klasse.

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();

De bovenstaande URL werd verkregen van https://resttesttest.com/.

Voorbeeld van OkHttp Android Headers

Als er geauthenticeerde query parameters zijn, kunnen ze worden toegevoegd in de vorm van headers zoals hieronder wordt getoond:

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

Verwerking van de JSON-response

We kunnen de JSON-gegevens parsen om de relevante parameters te krijgen en deze in een TextView weer te geven zoals in de onderstaande code.

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();
                        }
                    }
                });

            }
        });

Voorbeeld van OkHttp Android POST

Tot nu toe hebben we gekeken naar het verkrijgen van een respons door een paar API’s aan te roepen. Om gegevens naar de server te posten, moeten we ons verzoek op de volgende manier opbouwen.

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());
            }
        });
    }
}

In de bovenstaande code hebben we de MediaType-klasse gebruikt die deel uitmaakt van OkHttp om het type gegevens dat wordt doorgegeven te definiëren. We hebben de test API-URL gebruikt van https://reqres.in/. De post(RequestBody body)-methode wordt aangeroepen op de RequestBuilder met de relevante waarde. Het Log toont de volgende respons. {"name":"morpheus","job":"leader","id":"731","createdAt":"2017-01-03T17:26:05.158Z"}. OkHttp is de aanbevolen HttpClient die wordt gebruikt in de Retrofit Networking Library. We zullen hier later op ingaan in de volgende tutorial. We hebben drie knoppen toegevoegd aan de layout om elk van de methoden postRequest(), run() en de AsyncTask-wrapperklasse aan te roepen. U kunt het uiteindelijke Android OkHttp-project downloaden via de onderstaande link.

Download OkHttp Android Voorbeeldproject

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