热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

AndroidOKHttp使用简介

目前Android端调用网络请求最常用的框架就是OKHttp,目前项目中也经常会用到。介绍下OKHttp的使用场景

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

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

官网地址:square.github.io/okhttp/

配置

添加OKHttp依赖

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

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




接下来就可以愉快的开始使用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 使用的资料请关注其它相关文章!


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
author-avatar
可爱鼠标1985
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有