Поиск по сайту:

Учебное пособие по примерам OkHttp для Android


OkHttp — это сторонняя библиотека, представленная Square в 2013 году для отправки и получения сетевых запросов на основе HTTP.

OkHttp Android

Преимущества OkHttp для Android

Вот некоторые преимущества, которые дает нам OkHttp:

  1. Пул соединений
  2. Сжатие
  3. Кэширование
  4. Восстановление проблем с сетью
  5. Переадресация
  6. Повторные попытки
  7. Поддержка синхронных и асинхронных вызовов

Синхронные и асинхронные вызовы

  • Для синхронных вызовов требуется оболочка AsyncTask. Это означает, что он не поддерживает отмену запроса. Кроме того, AsyncTasks обычно пропускают контекст действия, что нежелательно.
  • Рекомендуется использовать асинхронный вызов, поскольку он поддерживает встроенную отмену, пометку нескольких запросов и отмену их всех одним вызовом метода (путем вызова отмены для экземпляра Acitivty внутри метода onPause или onDestroy).

Прежде чем мы рассмотрим реализацию OkHttp android, добавим следующую зависимость

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

Добавьте разрешение для Интернета в файл AndroidManifest.xml.

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

Пример кода OkHttp для Android

Ниже приведен файл 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);
                    }
                });

            }
        });
    }

}

Мы использовали тестовый API отсюда. Возвращаемая строка ответа имеет формат JSON, который выводится на экран. Вы можете попробовать другие API с открытым исходным кодом, такие как Github API, 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 Пример

До сих пор мы рассматривали возможность получения ответа путем вызова нескольких API. Чтобы отправить данные на сервер, нам нужно построить наш запрос следующим образом.

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-адрес тестового API с https://reqres.in/. Метод post(RequestBody body) вызывается в RequestBuilder с соответствующим значением. В журнале отображается следующий ответ. {name:morpheus,job:лидер,id:731,createdAt:2017-01-03T17:26:05.158Z}. OkHttp — это рекомендуемый HttpClient, который используется внутри сетевой библиотеки Retrofit. Мы рассмотрим это в следующем уроке. Мы добавили в макет три кнопки для вызова каждого из методов: postRequest(), run() и класса-оболочки AsyncTask. Вы можете загрузить окончательный проект Android OkHttp по ссылке ниже.

Скачать пример проекта OkHttp для Android