返回顶部
首页 > 资讯 > 精选 >Android中如何实现OKHttp
  • 394
分享到

Android中如何实现OKHttp

2023-06-15 04:06:49 394人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关Android中如何实现OKHttp,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下面是官网给出的OKHTTP的特点:支持HTTP/2, HTTP/2通过使用多路复用技术在一个

这篇文章将为大家详细讲解有关Android中如何实现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'

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

<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());            }        }    });

Android是什么

Android是一种基于linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

关于“Android中如何实现OKHttp”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Android中如何实现OKHttp

本文链接: https://lsjlt.com/news/277613.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中如何实现OKHttp
    这篇文章将为大家详细讲解有关Android中如何实现OKHttp,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下面是官网给出的OKHTTP的特点:支持HTTP/2, HTTP/2通过使用多路复用技术在一个...
    99+
    2023-06-15
  • android中okhttp实现断点上传示例
    前言 之前项目需要上传大文件的功能,上传大文件经常遇到上传一半由于网络或者其他一些原因上传失败。然后又得重新上传(很麻烦),所以就想能不能做个断点上传的功能。于是网上搜索,发...
    99+
    2022-06-06
    okhttp 示例 断点 Android
  • Android中怎么利用OKHTTP实现单例
    本篇文章为大家展示了Android中怎么利用OKHTTP实现单例,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android OKHTTP的单例和再封装的实例public class&nb...
    99+
    2023-05-30
    android okhttp
  • 如何在Android中利用OkHttp实现一个图片上传功能
    本篇文章给大家分享的是有关如何在Android中利用OkHttp实现一个图片上传功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现方法如下:object UploadFil...
    99+
    2023-05-31
    okhttp android roi
  • OkHttp如何实现透明压缩
    这篇文章主要介绍了OkHttp如何实现透明压缩的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇OkHttp如何实现透明压缩文章都会有所收获,下面我们一起来看看吧。什么叫透明压缩呢?OkHttps 在发送请求的时候...
    99+
    2023-06-27
  • Android中OkHttp是如何做网络请求的
    小编给大家分享一下Android中OkHttp是如何做网络请求的,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是OKhttp简单来说 OkHttp 就是一个客户端用来发送 HTTP 消息并对服务器的响应做出处理的应用层...
    99+
    2023-06-14
  • 如何在Android中利用OkHttp与php实现一个图片上传功能
    这篇文章给大家介绍如何在Android中利用OkHttp与php实现一个图片上传功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。今天写项目的时候需要多图片上传,就用okhttp简单写一个例子。public class...
    99+
    2023-05-31
    android okhttp php
  • android中实现OkHttp下载文件并带进度条
    OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作。下面我们用OkHttp来下载文件并带进度条!相关资料: 官网地址:http://square.github.io/okhttp/gi...
    99+
    2023-05-30
    okhttp 下载 文件
  • Android中OKHttp怎么使用
    OKHttp是一个开源的HTTP客户端库,用于在Android中发送和接收网络请求。下面是一个示例,展示了如何在Android中使用...
    99+
    2023-09-13
    Android
  • Android okHttp-sse 实现chatgpt逐字逐句效果
    1. 什么是SSE Server-Send Events 服务器发送事件,简称SSE。服务器主动向客户端推送消息,我们常见的有 WebSocket (SignalR) ,SSE 也是其中一种。     SSE 是HTML5规范的一部分,该规...
    99+
    2023-09-16
    okhttp
  • Android基于OkHttp实现文件上传功能
    本文实例为大家分享了Android基于OkHttp实现文件上传的具体代码,供大家参考,具体内容如下 一、相关概述 Android请求访问服务端大多数情况下依旧是使用http协议,故而...
    99+
    2024-04-02
  • Android入门之利用OKHttp实现断点续传功能
    目录简介课程目标断点下载的原理自定义Android里的ProgressBar的样式项目结构前端代码后端代码DbOpeerateHelper.javaDBService.javaDow...
    99+
    2023-01-09
    Android OKHttp断点续传功能 Android OKHttp断点续传 Android 断点续传 Android OKHttp
  • WebSocket中怎么利用OkHttp实现长连接
    WebSocket中怎么利用OkHttp实现长连接,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。WebSocket介绍先简单介绍下WebSoc...
    99+
    2024-04-02
  • Android中如何实现XML解析
    这篇文章主要为大家展示了“Android中如何实现XML解析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android中如何实现XML解析”这篇文章吧。首先创建在Android工程中创建一个A...
    99+
    2023-05-30
    android xml
  • Android如何使用OkHttp请求自签名的https网站
    这篇文章将为大家详细讲解有关Android如何使用OkHttp请求自签名的https网站,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。很多公司考虑到安全问题,项目中都采用https加密协议进行数据传输。但...
    99+
    2023-05-30
    android https
  • Android 中okhttp自定义Interceptor(缓存拦截器)
    Android 中okhttp自定义Interceptor(缓存拦截器) 前言: 新公司项目是没有缓存的,我的天,坑用户流量不是么。不知道有人就喜欢一个界面没事点来点去的么。怎...
    99+
    2022-06-06
    okhttp 拦截器 缓存 Android
  • android使用OkHttp实现下载的进度监听和断点续传
    1. 导入依赖包 // retrofit, 基于Okhttp,考虑到项目中经常会用到retrofit,就导入这个了。 compile 'com.squareup.retr...
    99+
    2022-06-06
    okhttp 监听 断点续传 断点 Android
  • android实现okHttp的get和post请求的简单封装与使用
    由于Android课程项目需要,特地查阅了okHttp的使用,发现网上找的大多和自己的需求不一样。所以就着团队项目需要,自己简单封装了一个okHttp的get和post请求。 话不多...
    99+
    2024-04-02
  • 如何在Android 中实现scp操作
    目录SSHSCPSFTPAndroid中使用SCPSFTP 删除文件本文简单介绍用SSH库ganymed-ssh2在Android中实现scp操作。 SSH SSH是专为远程登录会...
    99+
    2024-04-02
  • 如何在Android中实现通知栏
    今天就跟大家聊聊有关如何在Android中实现通知栏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、设置通知内容//CHANNEL_ID,渠道ID,Android 8.0...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作