美文网首页
网络请求库OkHttp的使用

网络请求库OkHttp的使用

作者: liut_2016 | 来源:发表于2016-11-29 10:58 被阅读269次

OkHttp是一个开源的Java的http网络请求库,常用于安卓的APP的网络请求。

  1. 第一步当然要导入jar包,由于OKhttp依赖okio,必须同时导入,这里可通过
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    compile 'com.squareup.okio:okio:1.9.0'

直接导入,或在官网下载jar包手动导入。

  1. 构建OkHttpClient对象
    一般可直接通过client = new OkHttpClient();即可,如需使用cache则要

        // 设置缓存目录与缓存大小上限
        Cache cache = new Cache(new File("okHttpCache"), 1024 * 1000);
        // okhttp3不再以setCache设置缓存而是通过OkHttpClient.Builder来设置了
        OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
        clientBuilder.cache(cache);
        // 构建客户端对象
        OkHttpClient = clientBuilder.build();
  1. 使用OKhttp进行GET请求;
    封装Request对象
        Request request = new Request.Builder()
                .url(url)
                .build();

阻塞式请求,通过client获取requestResponse对象

        Response response = client.newCall(request).execute();      //阻塞

需要注意的是调用.execute()方法会阻塞当前线程,会一直阻塞到请求完成。
请求结果已经封装在response对象内。

        if (response.isSuccessful()) {
            String content = response.body().string();
            System.out.println(content);
        }

异步请求:
异步请求可直接通过client获取

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

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                System.out.println("call = [" + call + "], response = [" + response + "]");
                System.out.println();
                if (!response.isSuccessful()) {
                    throw new IOException("" + response);
                }

                Headers headers = response.headers();
                for (int i = 0; i < headers.size(); i++) {
                    System.out.println(headers.name(i) + ": " + headers.value(i));
                }

                System.out.println();
                System.out.println(response.body().string());
            }
        });
  1. 使用OKhttp进行application/x-www-form-urlencoded方式POST请求
    封装请求参数
        RequestBody formBody = new FormBody.Builder()
                .add("param0", "lt")
                .add("param1", "lt2")
                .build();

阻塞式post请求:

        Request request = new Request.Builder().url(url).post(formBody).build();
        Response response = client.newCall(request).execute();

        if (response.isSuccessful()) {
            System.out.println(response.body().string());
        }

非阻塞式,跟get使用方式相似,如下

        Request request = new Request.Builder().url(url).post(formBody).build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                System.out.println(e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                System.out.println("非阻塞请求 \n" + response.body().string());
            }
        });

使用OKhttp进行application/json方式POST请求
封装请求参数同上

        RequestBody formBody = new FormBody.Builder()
                .add("param0", "lt")
                .add("param1", "lt2")
                .build();

设置MediaType

MediaType mediaType = MediaType.parse("application/json; charset=utf-8")

通过mediatypejson格式的请求参数来获取RequestBody

        RequestBody body = RequestBody.create(mediaType, json);

然后同上直接请求即可

        Request request = new Request.Builder().url(url).post(body).build();
        Response response = client.newCall(request).execute();

总的来说,就是先封装Request对象,再通过client获取Response或异步处理,POST则需额外的请求参数RequestBody和MediaType的封装。

完整测试代码

package xyz.liut.net.http.okhttp;

import java.io.File;
import java.io.IOException;

import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * OkHttp test
 * Created by liut_ on 2016/10/25.
 */

public class OkHttpTest {

    public static final String URL = "http://localhost:8080/WebTest/servlet";
    public static final MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
//    public static final MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");

    private OkHttpClient client;

    private OkHttpTest() {

        // 设置缓存目录与缓存大小上限
        Cache cache = new Cache(new File("okHttpCache"), 1024 * 1000);
        // okhttp3不再以setCache设置缓存而是通过OkHttpClient.Builder来设置了
        OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
        clientBuilder.cache(cache);
        // 构建客户端对象
        client = clientBuilder.build();

//        client.dispatcher().cancelAll(); // 可以取消全部请求

//        client = new OkHttpClient();      //不用缓存

    }

    void doGet(String url) throws IOException {
        Request request = new Request.Builder()
                .url(url)
                .build();
//        Response response = client.newCall(request).execute();      //阻塞

//        if (response.isSuccessful()) {
//            String content = response.body().string();
//            System.out.println(content);
//        }


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

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                System.out.println("call = [" + call + "], response = [" + response + "]");
                System.out.println();
                if (!response.isSuccessful()) {
                    throw new IOException("" + response);
                }

                Headers headers = response.headers();
                for (int i = 0; i < headers.size(); i++) {
                    System.out.println(headers.name(i) + ": " + headers.value(i));
                }

                System.out.println();
                System.out.println(response.body().string());
            }
        });

    }


    /**
     * 通过application/json方式post
     *
     * @param url  url
     * @param json params
     * @throws IOException
     */
    void doPostByJson(String url, String json) throws IOException {
        RequestBody body = RequestBody.create(mediaType, json);

        Request request = new Request.Builder().url(url).post(body).build();
        Response response = client.newCall(request).execute();

        if (response.isSuccessful()) {
            System.out.println(response.body().string());
        }
    }

    /**
     * 通过application/x-www-form-urlencoded
     *
     * @param url url
     * @throws IOException
     */
    void doPostByFormData(String url) throws IOException {
        RequestBody formBody = new FormBody.Builder()
                .add("param0", "lt")
                .add("param1", "lt2")
                .build();

        Request request = new Request.Builder().url(url).post(formBody).build();
//        Response response = client.newCall(request).execute();
//
//        if (response.isSuccessful()) {
//            System.out.println(response.body().string());
//        }

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

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                System.out.println("非阻塞请求 \n" + response.body().string());
            }
        });

    }


    public static void main(String[] args) throws IOException {
        OkHttpTest test = new OkHttpTest();

        test.doGet(URL + "?" + "param0=woca&param1=nihao");
        test.doPostByJson(URL, "{\"param0\":\"hehe\"}");
        test.doPostByFormData(URL);
    }

}

相关文章

  • 请求数据

    使用到 Okhttp网络请求 Glide图片加载库 Json解析之Gson OKHttp网络请求的封装:我用的是O...

  • Andriod网络处理

    网络请求:okhttp使用 第三方库okhttp的引入okhttp的引入 post请求 1.入参格式声明 2.请求...

  • OkHttp

    一、 简介 OkHttp是一个广泛使用的三方库,用于网络请求。okhttp的简单使用,主要包含: 一般的get请求...

  • Retrofit+RxBus事件流顶层封装Core库

    一、如何优雅的使用Retrofit网络请求库? 众所周知,Retrofit+OkHttp给我们开发者的网络请求提供...

  • Android面试宝典~性能优化

    响应时间优化 1、网络请求 使用优秀的网络框架库来提高请求速度 比如retrofit、okhttp 2、数据解析 ...

  • okhttp网络框架源码浅析(一)

    okhttp使用 app下gradle文件中引入okhttp okhttp同步请求 以上即为okhttp请求网络的...

  • 浅谈OkHttp以及Retrofit+RxJava的封装使用

    1.为什么我们要使用OkHttp?OkHttp有什么优点? 说OkHttp之前我们先说另外两个网络请求库——Htt...

  • Android 开源库之网络请求

    Okhttp OkHttp: 是Square 开源的网络请求库 参考:深入理解OKHttp源码 Retrofit ...

  • 网络请求库OkHttp的使用

    OkHttp是一个开源的Java的http网络请求库,常用于安卓的APP的网络请求。 第一步当然要导入jar包,由...

  • Okhttp 源码之旅

    前言 目前android最流行的网络请求库应该非Okhttp莫属了,我们都知道Okhttp使用起来很方便,而且很高...

网友评论

      本文标题:网络请求库OkHttp的使用

      本文链接:https://www.haomeiwen.com/subject/mgpjpttx.html