欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

OKHttp3 基础入门

程序员文章站 2024-01-20 18:41:22
OKHttp简介OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient (android API23 6.0里已移除HttpClient)。详情参见官方网站优点支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。)socket自动选择最好路线,并支持自动重连,拥有自动维护的so...

OKHttp简介

OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架
由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient (android API23 6.0里已移除HttpClient)。

推荐几个不错OKHttp3的博客地址:
Android开源框架源码鉴赏:Okhttp
OKHttp源码解析
Android OkHttp3使用详解
OKHttp3 基本用法
OkHttp 官方中文文档
更多详情参见官方网站

优点
  • 支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。)
  • socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数。
  • 基于Headers的缓存策略减少重复的网络请求。
  • 拥有Interceptors轻松处理请求与响应(自动处理GZip压缩)。

OkHttp3使用

首先记得在build.gradle 和 配置文件分别加上依赖 和 网络权限

compile 'com.squareup.okhttp3:okhttp:3.8.0'
compile 'com.squareup.okio:okio:1.12.0'

添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>
1.异步GET请求

下载一个工作线程的文件,当响应是可读的时候,获取回调(Callback)。当响应头已经准备好后,将产生回调(Callback)。读取响应体可能一直阻塞。目前OkHttp不提供异步API来接收响应体的部位。

  public void asyncget() throws Exception {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build();

    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 {
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

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

        System.out.println(response.body().string());
      }
    });
  }
2.同步GET请求

下载文件,打印其头部,并以字符串形式打印其响应体。
该string() 方法在响应体中是方便快捷的小型文件。但是,如果响应体是大的(大于1 MIB以上),它会在整个文件加载到内存中,所以应该避免string() 。在这种情况下,更倾向于将响应体作为流进行处理。


    public void syncget() throws Exception {
        //1.创建OkHttpClient对象
        OkHttpClient okHttpClient = new OkHttpClient();
        //2.创建Request对象,设置一个url地址,设置请求方式。
        Request request = new Request.Builder()
                .url("http://publicobject.com/helloworld.txt")
                .method("GET", null)//可以不写,默认就时get
                .build();
        //3.创建一个call对象,参数就是Request请求对象
        Call call = okHttpClient.newCall(request);
        //4.同步调用会阻塞主线程,这边在子线程进行
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //同步调用,返回Response,会抛出IO异常
                    Response response = call.execute();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
3.访问头

典型的HTTP头工作就像一个Map<String, String> :每个字段都有一个值或无值。但是,一些头部(headers)允许多个值,比如Guava的Multimap。例如,它共同为一个HTTP响应提供多个Vary头。OkHttp的API,试图使这两种情况下都能舒适使用。

当写请求头,用header(name, value)来为唯一出现的name设置value。如果存在现有值,在添加新的value之前,他们将被移除。使用addHeader(name, value)来添加头部不需要移除当前存在的headers。

当读取响应头,用header(name)返回最后设置name的value。如果没有value,header(name)将返回null。读取所有以列表字段的值,可以使用headers(name)。

要访问所有的头部,用Headers类,它支持索引访问。

    public void run() throws Exception {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("https://api.github.com/repos/square/okhttp/issues")
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("Accept", "application/json; q=0.5")
                .addHeader("Accept", "application/vnd.github.v3+json")
                .build();

        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

        System.out.println("Server: " + response.header("Server"));
        System.out.println("Date: " + response.header("Date"));
        System.out.println("Vary: " + response.headers("Vary"));
    }

4.POST请求

使用FormBody.Builder建立一个请求体,它就像一个HTML 的标记。Names和values将使用HTML兼容的表单URL编码进行编码。

    public void run() throws Exception {
        OkHttpClient client = new OkHttpClient();
        RequestBody formBody = new FormBody.Builder()
                .add("search", "Jurassic Park")
                .build();
        Request request = new Request.Builder()
                .url("url")
                .post(formBody)
                .build();

        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

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

本文地址:https://blog.csdn.net/weixin_43824520/article/details/107515119