مثال تعليمي لـ OkHttp على Android

OkHttp هي مكتبة من الطرف الثالث تم تقديمها من قبل Square في عام 2013 لإرسال واستقبال طلبات الشبكة القائمة على HTTP.

OkHttp Android

في البداية، كان لدى Android معالج HTTP فقط اثنين: HttpURLConnection و Apache HTTP Client؛ لإرسال واستقبال البيانات من الويب. كل من هذه العملاء يتطلب كتابة الكثير من رموز البنية الأساسية داخل AsyncTask أو طرق خيوط الخلفية. علاوة على ذلك، لكل من هذه العملاء مجموعاتهم الخاصة من القيود عندما يتعلق الأمر بإلغاء طلب HTTP أو تجميع الاتصالات.

توفر OkHttp android تنفيذًا لواجهات HttpURLConnection و Apache Client من خلال العمل مباشرة على أعلى جافا Socket دون استخدام أي تبعيات إضافية.

مزايا OkHttp Android

بعض المزايا التي يجلبها OkHttp لنا هي:

  1. تجميع الاتصالات
  2. ضغط Gzip
  3. التخزين المؤقت
  4. التعافي من مشاكل الشبكة
  5. إعادة توجيهات
  6. إعادة المحاولات الدعم للمكالمات المتزامنة والمتزامنة

المكالمات المتزامنة مقابل المكالمات الغير متزامنة

  • المكالمات المتزامنة تتطلب واجهة AsyncTask تكوينًا حولها. وهذا يعني أنها لا تدعم إلغاء الطلب. بالإضافة إلى ذلك، تسرب AsyncTask بشكل عام سياق النشاط، وهو ما لا يفضل.
  • الاتصال الغير متزامن هو الطريقة الموصى بها نظرًا لدعمه للإلغاء الأصلي، ووسم العديد من الطلبات وإلغائها جميعًا بمكالمة واحدة للطريقة (من خلال استدعاء الإلغاء على مثيل النشاط داخل الطريقة onPause أو onDestroy).

قبل أن ننظر في تنفيذ OkHttp android، أضف الاعتمادية التالية

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

أضف الإذن للإنترنت داخل ملف AndroidManifest.xml.

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

مثال OkHttp Android Code

يتم تقديم MainActivity.java للمكالمات المتزامنة أدناه.

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

}

بالنسبة للمكالمات الغير متزامنة، يجب تعريف MainActivity.java على النحو التالي:

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

            }
        });
    }

}

لقد استخدمنا واجهة برمجة تطبيقات اختبارية من هنا. سلسلة الاستجابة المُرجعة هي بتنسيق JSON التي يتم طباعتها على الشاشة. يمكنك تجربة واجهات برمجة تطبيقات مفتوحة المصدر أخرى مثل واجهة برمجة تطبيقات Github و Stackoverflow إلخ.

مثال على معلمات الاستعلام في OkHttp

إذا كانت هناك أي معلمات استعلام يمكننا تمريرها بسهولة باستخدام فئة 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();

تم الحصول على عنوان URL أعلاه من خلال https://resttesttest.com/.

مثال على رؤوس OkHttp لنظام Android

إذا كانت هناك أي معلمات استعلام مصادق عليها ، فيمكن إضافتها في شكل رؤوس كما هو موضح أدناه:

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

معالجة الاستجابة JSON

يمكننا تحليل البيانات JSON للحصول على المعلمات ذات الصلة وعرضها في TextView كما هو موضح في الكود التالي.

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

حتى الآن، قمنا بالنظر إلى الحصول على استجابة عن طريق استدعاء بعض واجهات برمجة التطبيقات. لنقم بنشر بيانات إلى الخادم، نحتاج إلى بناء طلبنا بالطريقة التالية.

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

في الشيفرة أعلاه، استخدمنا فئة MediaType التي هي جزء من OkHttp لتحديد نوع البيانات المرسلة. لقد استخدمنا عنوان URL لاختبار الواجهة البرمجية من https://reqres.in/. يتم استدعاء الطريقة post(RequestBody body) على موجه الطلب مع القيمة ذات الصلة. يعرض السجل الآتي كإجابة. {"name":"morpheus","job":"leader","id":"731","createdAt":"2017-01-03T17:26:05.158Z"}. OkHttp هو مكتبة HttpClient الموصى بها التي تُستخدم داخل مكتبة Retrofit Networking. سنتناول هذا في الدرس التالي. لقد أضفنا ثلاثة أزرار في التخطيط لاستدعاء كل من الطرق postRequest()، run() وفئة الـ AsyncTask wrapper. يمكنك تنزيل مشروع Android OkHttp النهائي من الرابط أدناه.

تنزيل مشروع مثال OkHttp Android

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