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

Android OKHttp使用简介

程序员文章站 2022-06-23 07:53:46
下面是官网给出的okhttp的特点: 支持http/2, http/2通过使用多路复用技术在一个单独的tcp连接上支持并发, 通过在一个连接上一次性发送多个请求来发送或接收数据; 如果ht...

下面是官网给出的okhttp的特点:

  1. 支持http/2, http/2通过使用多路复用技术在一个单独的tcp连接上支持并发, 通过在一个连接上一次性发送多个请求来发送或接收数据;
  2. 如果http/2不可用, 连接池复用技术也可以极大减少延时;
  3. 透明的gzip处理降低了通信数据的大小
  4. 响应缓存完全避免了网络中的重复请求
  5. 使用okio来简化数据的访问与存储,提高性能
  6. 如果您的服务器配置了多个ip地址, 当第一个ip连接失败的时候, okhttp会自动尝试下一个ip
  7. okhttp还处理了代理服务器问题和ssl握手失败问题;

官网地址:

配置

添加okhttp依赖

implementation 'com.squareup.okhttp3:okhttp:3.12.3'

添加网络权限,如果需要文件读写文件读写权限

<uses-permission android:name="android.permission.internet" />
<uses-permission android:name="android.permission.write_external_storage" />
<uses-permission android:name="android.permission.read_external_storage" />

接下来就可以愉快的开始使用okhttp进行开发了。

创建okhttpclient

okhttpclient通过builder构建,构建的时候涉及到很多配置项,本次简单对其中一些配置项做了说明,后续会对一些重要的配置项做专题说明。在实际的项目中的配置项根据项目具体需求进行配置。

    okhttpclient.builder builder = new okhttpclient.builder();

    //缓存目录
    file externalcachedir = context.getexternalcachedir();
    if (externalcachedir != null) {
        cache okhttpcache = new cache(new file(externalcachedir,
                "httpcache"), 30 * 1024 * 1024);
        builder.cache(okhttpcache);
    }

    //连接超时时间,连接超时是在将tcp socket 连接到目标主机时应用的,默认10s
    builder.connecttimeout(30, timeunit.seconds);
    //读取超时时间, 包括tcp socket和source 和response的读取io操作,默认10s
    builder.readtimeout(20, timeunit.seconds);
    //写入超时时间,主要指io的写入操作,默认10s
    builder.writetimeout(20, timeunit.seconds);
    //整个调用时期的超时时间,包括解析dns、链接、写入请求体、服务端处理、以及读取响应结果
    builder.calltimeout(120, timeunit.seconds);

    //用于单个client监听所有解析事件的,可以用于解析耗时计算
    builder.eventlistener(eventlistener.none);

    //添加拦截器,框架内部已经默认添加了部分拦截器,通过接口添加的拦截器在列表首部
    builder.addinterceptor(new loginterceptor());
    //添加网络拦截器,网络拦截器可以操作重定向和失败重连的返回值,以及监控所有的网络数据
    builder.addnetworkinterceptor(new networkinterceptor());

    //在握手期间,如果url的主机名和服务器的标识主机名不匹配,验证机制可以回调此接口的实现者,以确定是否应该允许此连接。
    //返回false表示不允许此链接,无脑return true 十分不安全
    builder.hostnameverifier(new hostnameverifier() {
        @override
        public boolean verify(string hostname, sslsession session) {
            return true;
        }
    });

//授权,默认为authenticator.none
//        builder.authenticator(authenticator.none);

//连接池,默认5个空闲连接,连接保活5分钟
//        builder.connectionpool(new connectionpool());

//自定义cookiejar,默认cookiejar.no_cookies
//        builder.cookiejar(cookiejar.no_cookies);

//调度策略,默认最大并发数默认为 64,但个域名最大请求数 默认为 5 个
//        builder.dispatcher(new dispatcher());

//配置证书认证策略
//        builder.sslsocketfactory();

      okhttpclient  client = builder.build();

上述配置项中比较常用的有

  1. 缓存文件路径以及缓存的容量大小
  2. 网络请求的链接、读取、写入的超时时间
  3. 拦截器,这个是okhttp最常用的,可以用于处理包括重试、缓存、日志打印等功能
  4. 域名和证书的校验
  5. 连接器以及并发的调度策略等

同步get请求

public void synget(string url) {
        
        // 第一步,构建httpurl
        httpurl.builder builder = null;
        try {
            httpurl httpurl = httpurl.parse(url);
            if(httpurl != null){
                builder = httpurl.newbuilder();
            }
        } catch (illegalargumentexception e) {
            e.printstacktrace();
        }

        if (builder == null) {
            return;
        }
        builder.addqueryparameter("key","value");

        // 第二步,构建request请求对象
        request request = new request.builder()
                //请求地址
                .url(httpurl)
                //get请求,默认为get请求
                .get()
                //添加请求头,一个key对应多个value,可以自定义
                .addheader("key", "value")
                .addheader("key", "value1")
                //请求头,一对一的,如常见的content-type、accept-encoding等
                .header("key1", "value1")
                //缓存策略,当前使用强制网络请求
                .cachecontrol(cachecontrol.force_network)
                //缓存策略
                .build();

        try {
            //第三步,开始进行同步请求
            response response = client
                    .newcall(request)
                    .execute();

            //第四步,解析响应结果
            responsebody body = response.body();
            if (body != null) {
                log.d(tag, body.string());
            }
        } catch (ioexception e) {
            e.printstacktrace();
        }
    }

同步get请求会阻塞当前线程直到返回结果,请求大致分为四个步骤:

  1. 构建httpurl,当然这一步不是必须的,也可以直接传入地址
  2. 第二步,构建request请求对象,可以设置请求头,缓存策略,请求方式
  3. 第三步,开始进行同步请求
  4. 解析响应结果

注意:同步get请求要在子线程中进行,否应用会抛异常。

异步get请求

异步请求方式的步骤和上述前两个步骤基本一致,主要发起请求的方式发生了变化,结果通过回调返回。这种请求方式对请求的线程没有限制。

// 第一步,构建httpurl
// 第二步,构建request请求对象
//第三步,开始进行异步请求
client.newcall(request).enqueue(new callback() {
            @override
            public void onfailure(call call, ioexception e) {

            }

            @override
            public void onresponse(call call, response response) throws ioexception {
                //第四步,解析响应结果
                responsebody body = response.body();
                if (body != null) {
                    log.d(tag, body.string());
                }
            }
        });

同步post请求

public void synpost(string url) {
    // 第一步,构建httpurl
    httpurl.builder builder = null;
    try {
        httpurl httpurl = httpurl.parse(url);
        if (httpurl != null) {
            builder = httpurl.newbuilder();
        }
    } catch (illegalargumentexception e) {
        e.printstacktrace();
    }
    if (builder == null) {
        return;
    }

    //第二步,构建requestbody
    mediatype mediatype = mediatype.parse("application/json;charset=utf-8");
    jsonobject jsonobject = new jsonobject();
    try {
        jsonobject.put("key1", "value1");
        jsonobject.put("key2", "value2");
    } catch (jsonexception e) {
        e.printstacktrace();
    }
    requestbody requestbody = requestbody.create(mediatype, jsonobject.tostring());
    // 第三步,构建request请求对象
    request request = new request.builder()
            .url(builder.build())
            .post(requestbody)
            .build();
    
    //第四步,开始进行同步post请求
    try {
        response response = client.newcall(request).execute();
        //第五步,解析请求结果
        responsebody body = response.body();
        if (body != null) {
            log.d(tag, body.string());
        }
    } catch (ioexception e) {
        e.printstacktrace();
    }
}

与get请求方式不同的是post请求需要构建requestbody,在请求时携带requestbody。

异步post请求

public void asynpost(string url) {
        // 第一步,构建httpurl
        //第二步,构建requestbody
        // 第三步,构建request请求对象
        request request = new request.builder()
                .url(builder.build())
                .post(requestbody)
                .build();

        client.newcall(request).enqueue(new callback() {
            @override
            public void onfailure(call call, ioexception e) {
                
            }

            @override
            public void onresponse(call call, response response) throws ioexception {
                responsebody body = response.body();
                if (body != null) {
                    log.d(tag, body.string());
                }
            }
        });
    }

上传文件

    //第一步,构建httpurl
    //第二步,构建requestbody
    mediatype mediatype = mediatype.parse("multipart/form-data; charset=utf-8");
    requestbody requestbody = requestbody.create(mediatype, file);
	//第三步,构建multipartbody
    multipartbody body = new multipartbody.builder()
            .settype(multipartbody.form)
            //在此处添加多个requestbody实现多文件上传
            .addformdatapart("file", file.getname(), requestbody)
            .build();

    // 第四步,构建request请求对象
    request request = new request.builder()
            .url(builder.build())
            .post(body)
            .build();
	// 第五步,构建request请求对象
    client.newcall(request).enqueue(new callback() {
        @override
        public void onfailure(call call, ioexception e) {

        }

        @override
        public void onresponse(call call, response response) throws ioexception {
            responsebody body = response.body();
            if (body != null) {
                log.d(tag, body.string());
            }
        }
    });

表单提交

	//第二步,构建requestbody
    formbody formbody = new formbody.builder()
            .add("key1","value1")
            .add("key2","value2")
            .build();

    // 第三步,构建request请求对象
    request request = new request.builder()
            .url(builder.build())
            .post(formbody)
            .build();

    client.newcall(request).enqueue(new callback() {
        @override
        public void onfailure(call call, ioexception e) {

        }

        @override
        public void onresponse(call call, response response) throws ioexception {
            responsebody body = response.body();
            if (body != null) {
                log.d(tag, body.string());
            }
        }
    });

以上就是okhttp 使用简介的详细内容,更多关于okhttp 使用的资料请关注其它相关文章!

相关标签: OKHttp Android