OkHttp Android Beispiel Tutorial

OkHttp ist eine von Square im Jahr 2013 eingeführte Drittanbieter-Bibliothek zum Senden und Empfangen von HTTP-basierten Netzwerkanfragen.

OkHttp Android

Anfänglich hatte Android nur zwei HTTP-Clients: HttpURLConnection und Apache HTTP Client, um Daten aus dem Web zu senden und zu empfangen. Für jeden dieser Clients war eine Menge Boilerplate-Code erforderlich, der innerhalb der AsyncTask- oder der Hintergrundthread-Methoden geschrieben werden musste. Darüber hinaus haben diese Clients ihre eigenen Einschränkungen, wenn es darum ging, eine HTTP-Anfrage abzubrechen oder eine Verbindungspooling durchzuführen. OkHttp Android bietet eine Implementierung der Schnittstellen HttpURLConnection und Apache Client, indem es direkt auf einem Java-Socket arbeitet, ohne zusätzliche Abhängigkeiten zu verwenden.

OkHttp Android Vorteile

Einige Vorteile, die OkHttp mit sich bringt, sind:

  1. Verbindungspooling
  2. Gziping
  3. Caching
  4. Wiederherstellung bei Netzwerkproblemen
  5. Weiterleitungen
  6. Wiederholungen
  7. Unterstützung für synchrone und asynchrone Aufrufe

Synchrone vs. asynchrone Aufrufe

  • Synchrone Aufrufe erfordern einen AsyncTask-Wrapper darum. Das bedeutet, dass das Abbrechen einer Anfrage nicht unterstützt wird. Außerdem undichte AsyncTasks im Allgemeinen den Kontext der Aktivität, was nicht bevorzugt ist.
  • Asynchrone Aufrufe sind der empfohlene Weg, da sie natives Abbrechen unterstützen, mehrere Anfragen markieren und alle mit einem einzelnen Methodenaufruf abbrechen können (durch Aufrufen der Abbruchmethode auf der Aktivitätsinstanz innerhalb der onPause oder onDestroy Methode).

Bevor wir uns die Implementierung von OkHttp Android ansehen, fügen Sie die folgende Abhängigkeit hinzu

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

Fügen Sie die Berechtigung für das Internet in der Datei AndroidManifest.xml hinzu.

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

OkHttp Android Beispielcode

Der MainActivity.java für synchrone Aufrufe wird unten angegeben.

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

}

Für asynchrone Aufrufe sollte die MainActivity.java wie folgt definiert werden:

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

            }
        });
    }

}

Wir haben eine Test-API von hier verwendet. Die zurückgegebene Antwortzeichenfolge ist im JSON-Format, das auf dem Bildschirm angezeigt wird. Sie können auch andere Open-Source-APIs wie die Github-API, Stackoverflow usw. ausprobieren.

Beispiel für OkHttp-Abfrageparameter

Wenn es Abfrageparameter gibt, können wir sie einfach mithilfe einer Klasse HttpUrl.Builder übergeben.

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

Die obige URL wurde von https://resttesttest.com/ erhalten.

Beispiel für OkHttp-Android-Header

Wenn es authentifizierte Abfrageparameter gibt, können sie in Form von Headern hinzugefügt werden, wie unten dargestellt:

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

Verarbeiten der JSON-Antwort

Wir können die JSON-Daten analysieren, um die relevanten Parameter zu erhalten und sie wie folgt in einem TextView anzuzeigen.

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

            }
        });

OkHttp Android POST Beispiel

Bisher haben wir uns damit beschäftigt, eine Antwort durch Aufrufen einiger APIs zu erhalten. Um Daten an den Server zu senden, müssen wir unsere Anfrage folgendermaßen erstellen.

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

Im obigen Code haben wir die MediaType-Klasse verwendet, die Teil von OkHttp ist, um den Datentyp festzulegen, der übergeben wird. Wir haben die Test-API-URL von https://reqres.in/ verwendet. Die Methode post(RequestBody body) wird auf dem RequestBuilder mit dem relevanten Wert aufgerufen. Das Log zeigt die folgende Antwort an. {"name":"morpheus","job":"leader","id":"731","createdAt":"2017-01-03T17:26:05.158Z"}. OkHttp ist der empfohlene HttpClient, der im Retrofit Networking Library verwendet wird. Im nächsten Tutorial werden wir uns dies genauer ansehen. Wir haben drei Schaltflächen zum Layout hinzugefügt, um jede der Methoden postRequest(), run() und die AsyncTask-Wrapper-Klasse aufzurufen. Sie können das endgültige Android OkHttp-Projekt über den folgenden Link herunterladen.

OkHttp Android Beispielprojekt herunterladen

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