Android中OkHttp使用手册

安卓okhttp如何上传文件、图片以及数据 前言 由于前段时间参加学校比赛,都没有时间来更新博客,这里给大家带来一篇非常实用的文章 本文类容 安卓如何通过okhttp2.0上传数据、文件,而我们的后端采用的是spring boot2.0来接收我们的上传的数据 前期准备 1、导入箭头所指向的这两个包,如果没有则点击这里进行下载 2、由于我们要上传文件图片,所以我们必须要加入权限,而安卓6.0之后对权限要求很严格,不仅要在xml里面配置,还要... 阅读详情

OkHttp使用手册

简介

OkHttp是Square出的Http通讯库,支持HTTP和HTTP/2,用于Android应用和Java应用。

OkHttp是非常优秀的Http通讯库,将Http连接中各种繁杂的问题,对并发的支持,对常见异常的处理等封装在底层,提供简单易用的API供应用中调用。与之相比,HttpUrlConnection的使用过于复杂,Appache的HttpClient在Android平台上的运行又有各种问题,在Android 6.0之后,已经将HttpClient库从SDK中删除,全面转向使用OkHttp。

目前有很多知名的Android三方框架都使用OkHttp作为网络连接的默认基栈,例如Volley,Glide,Retrofit等,从中也能看出学习OkHttp的必要性。

基本使用

在项目中添加对OkHttp的依赖

在需要使用OkHttp的模块的build.gradle文件中,添加如下依赖:(版本号可能变更)

compile 'com.squareup.okhttp3:okhttp:3.2.0'

初始化

OkHttp框架的核心类是OkHttpClient,此类可直接实例化。由于OkHttpClient内部处理了并发,多线程和Socket重用等问题,为了节省资源,整个应用中使用一个OkHttpClient对象即可,可以对它做Singleton封装。

OkHttpClient okHttpClient = new OkHttpClient();

OkHttp请求的构建

代表Http请求的类是Request,该类使用构造器模式,最简单的构造GET请求如下:

Request request = new Request.Builder()
      .url(url)
      .build();

要构造Post请求,在构建Request时增加请求体即可:

Request request = new Request.Builder()
    .url(url)
    .post(RequestBody)
    .build();

RequestBody formBody = new FormEncodingBuilder()
    .add("name", "Cuber")
    .add("age", "26")
    .build();

OkHttp请求的发送

请求的发送有两种形式,一种是直接同步执行,阻塞调用线程,直接返回结果;另一种是通过队列异步执行,不阻塞调用线程,通过回调方法返回结果。如下所示:

同步执行:

// 如果返回null,代表超时或没有网络连接
Response response = client.newCall(request).execute();

异步回调:

Response response = client.newCall(request).enqueue(new Callback() {

    @Override
    public void onFailure(Request request, IOException e) {
        //超时或没有网络连接
        //注意:这里是后台线程!
    }

    @Override
        public void onResponse(Response response) throws IOException {
        //成功
        //注意:这里是后台线程!
    }
});

以上这些就是快速上手OkHttp需要知道的全部内容,可以从中看出,它的API非常简单易用。

Call模型

Http客户端的任务是处理请求和响应,这说起来简单,但实际过程很复杂。

  • 请求:Http请求包含一个URL,请求方法(例如GET或者POST),请求头。还可能包含请求体,可以是数据流也可以是指定的内容类别。
  • 响应:用一个响应码来回应请求(例如200代表成功,404代表页面未找到),响应头和响应体。

请求的重写

  • 为了保证正确性和传输效率,OkHttp会在发送你的请求之前重写它,例如:
  • OkHttp可能会添加原始请求中缺失的头信息,包括Content-Length, Transfer-Encoding, User-Agent, Host, Connection, 和 Content-Type。
  • 为了实现透明的响应压缩(transparent response compression),OkHttp会增加Accept-Encoding头信息。
  • 如果你收到了cookie,OkHttp会增加Cookie头信息。
  • 某些请求可能会对响应做缓存。如果被缓存的响应不是最新的,OkHttp能做一个有条件的GET请求来下载更新后的响应。此功能需要添加If-Modified-Since和If-None-Match等头信息。

响应的重写

如果使用了透明压缩,OkHttp会去掉对应响应的Content-Encoding和Content-Length头信息,因为它们不能应用于解压后的响应体。

如果有条件的GET成功了,网络侧的响应和缓存的响应会被自动合并。

重定向

如果你请求的URL被移动了,服务器会返回类似于302这样的响应码,来指明新的URL。OkHttp能跟随新的URL,获取到最终的响应。

请求的重试

有时会发生连接失败:可能网络连接状况不好,或者服务器不可达。OkHttp会自动使用不同的路由来重试请求。

Call模型

由于以上的重写,重定向和重试等操作,你的一个简单请求可能会产生多个请求和响应。OkHttp使用Call这一概念对此来建模:不论为了满足你的请求任务,中间做了多少次请求和响应,都算作一个Call。

Call有两种方式来执行:

  • 同步方式:你的线程会被阻塞,知道响应可读。
  • 异步方式:你在任意线程将请求排队,当响应可读时,会在另一个线程拿到回调。

Call的取消

使用Call.cancel()来停止一个执行中的请求。如果线程正在写请求或读响应,则会收到IOException。使用此方法,在一个Call已经不需要时取消它,可以节省网络流量

Call可以在任意线程取消,如果请求没有完成,调用取消方法会导致请求失败,读写请求体和响应体的代码会产生IOException。

拦截器

OkHttp在请求响应过程中可以添加拦截器,拦截请求和响应的数据等。

需要加依赖

compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

用法

初始化拦截器,设置拦截级别,添加到OkHttpClient中

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

okHttpClient = new OkHttpClient.Builder()
        .addInterceptor(interceptor)
        .build();

响应体解析-使用Gson

添加依赖

compile 'com.google.code.gson:gson:2.8.0'

以下代码使用Gson库来解析服务器响应的JSON信息

FAQ

OkHttp如何设置超时?

设置超时的方法很简单:

OkHttpClient client = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)  // 连接超时
    .writeTimeout(10, TimeUnit.SECONDS)    // Socket写超时
    .readTimeout(30, TimeUnit.SECONDS)     // Socket读超时
    .build();

注意readTimeout和writeTimeout被用于OkHttp内部的Connection类,用在setSoTimeout方法上来设置Socket。

另外,在2.5.0版本之后,读、写、连接超时的默认值是10s。

OkHttp中,Callback的回调方法onFailure和onResponse是在主线程执行码?

不是,OkHttp是一个Java库,不是Android库,它对Android主线程一无所知,所以这两个回调方法自然是在后台线程执行。实际开发中,常常对OkHttp做二次封装,来直接将结果传递给主线程。

也可以实现Callback类,自己做一个抽象类UICallback,从而可以在UI中运行

public abstract class UICallback implements Callback{

    private final Handler handler = new Handler(Looper.getMainLooper());

    @Override
    public void onFailure(final Call call, final IOException e) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                onFailureInUi(call, e);
            }
        });
    }

    @Override
    public void onResponse(final Call call, final Response response)  {

        try {
            if (!response.isSuccessful()) {
                throw new IOException("error code: " + response.code());
            }

            final String content = response.body().string();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    onResponseInUi(call, content);
                }
            });
        } catch (IOException e) {
            onFailure(call, e);
        }
    }

    public abstract void onFailureInUi(Call call, IOException e);

    public abstract void onResponseInUi(Call call, String body);
}
Android如何使用OKHttp 首先要在build.gradle里面写入 // 添加OKHttp支持 implementation("com.squareup.okhttp3:okhttp:4.3.1") 下面是代码 下面是activity的java代码 package com.example.okhttpdemo; import androidx.appcompat.app.AppCompatActivi... 阅读详情

相关推荐

Okhttp面试简答,Android开发自学教程

1、支持SPDY、HTTP2.0 2、无缝支持GZIP来减少数据流量 3、支持同步、异步(异步使用较多) 4、缓存响应数据来减少重复的网络请求 5、可以从很多常用的连接问题中自动恢复 1.2、Okhttp的核心类有哪些?简单讲一下 Dispatcher类: Interceptor类: 1.3、OkHttp方面的其他面试题 1、如何使用OkHttp进行异步网络请求,并根据请求结果刷新UI 2、可否介绍一下OkHttp的整个异步请求流程 3、OkHttp对于网络请求都有哪些优化,如何实现的 4、OkHttp

m0_66265031的博客 1608

OkHttp用法详解

OkHttp用法详解

ruanyandong的博客 1万+

Android 对okhttp的封装

不废话,需求:根据服务器API封装网络请求,怎么办? 简单封装okhttp的get,post,put,delete请求: PersistentCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(getApplicationCo...

谢岩的博客 4470

OKHttp使用详解

1、简介 OkHttp 是一个默认高效的 HTTP 客户端: HTTP/2 支持允许对同一主机的所有请求共享一个套接字。 连接池减少了请求延迟(如果 HTTP/2 不可用)。 透明 GZIP 缩小了下载大小。 响应缓存完全避免了网络重复请求。 2、引入依赖 <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId>

small_love的专栏 7661

安卓okhttp连接mysql_Android PHP Okhttp3模拟登陆和注册

全部代码:源码地址大致流程经过长达一个星期的研究,网上找了无数实例,大都只有客户端,或者用URLHttpConnection而不是OKHttp3,或者代码太过时根本调不通。经历了数不清的痛苦,东拼西凑总算找到方法跑通了,个中艰辛,真是无法言表。1.登陆使用okhttp3来发送post,将用户名,密码封装成MAP在request里2.服务器端来读取POST,与数据库验证成功再发回登陆成功消息,以JS...

weixin_36292762的博客 654

Android进阶之路 - OkHttp的入门使用

因前一篇并没有把具体的效果图展现,故本篇讲解的同样是okHttp下的Get请求与Post请求,不包含文件与图片的上传与下载(之后可能在中级使用中讲到)前提 (使用了三方平台的接口) :Effect :还有一些主要注意,可通过上一篇okHttp查看,链接地址如下:http://blog.youkuaiyun.com/qq_20451879/article/details/55001505MainActivity

Android、前端、小程序、后端 2384

android中引入okhttp

选择在低版本中运行的,android 7 代码通过学习 https://square.github.io/okhttp/ 中的 sAndroidManifest.xml 中新增权限 <uses-permission android:name="android.permission.INTERNET"></uses-permission> 引入 okIo和okhttp包 搜所okio import androi...

Alex的博客 4871

android okHttp的简单使用

这个Demo里简单使用okHttp做了一些操作,包括get请求,post请求,下载图片,文件上传的使用,对于初学okHttp的人比较有用

安卓okhttp3进行网络请求,一个简单的登录页面的实现

安卓okhttp3进行网络请求,一个简单的登录页面的实现文章目录一、前言二、配置okhttp3三、activity_main.xml文件MainActivity的实现 文章目录 一、前言 本文通过okhttp3实现安卓app进行后台webapi的网络访问。 初学android,想开发一个简单的app,在网上查阅了大量的资料,但是都是一些很老的教程了,虽然适用,但是讲的不是很清楚,对没有系统学习过安卓的人来说很不友好。 二、配置okhttp3 <!--在app目录下的 build.gradle文件中添加

weixin_45606099的博客 4010

Cadence17.4 Allegro PCB制板(gerber / 光绘)文件输出的顺序及注意点

Cadence Allegro PCB制板文件输出 (gerber 光绘文件输出)

weixin_45331044的博客 1万+

特斯拉数字孪生4.0体系解析:从“数字镜像“到“持续进化“的造车革命

当每一辆汽车都拥有自己的“数字分身”,我们正见证的不仅是技术革新,更是整个制造业文明形态的跃迁。其数字孪生体已超越“数字镜像”的被动属性,成为。特斯拉年服务收入超1200美元/车的业绩表明,数字孪生正在将汽车从“交通工具”转变为“持续增值的智能终端”。构建起覆盖设计、制造、使用、服务全链条的虚拟镜像体系,将物理世界与数字世界的融合推向新高度。:特斯拉的实践证明,数字孪生已从“技术选项”升级为“战略必选项”。不仅重塑了汽车产品的价值创造逻辑,更预示着整个制造业向“元宇宙工业”演进的新范式。

beige888的博客 1609

开发日记--安卓中okhttp的使用

安卓和django的项目中使用okhttp进行通信。

qq_69194611的博客 1017

Python 格点数据插值到站点 最邻近插值 双线性插值

python 气象数据格点数据插值到站点,最邻近插值法,双线性插值法

好记性不如烂笔头 8460

Android安卓使用okHttp实现post,get请求,并解析数据

Android安卓使用okHttp实现post,get请求,并解析数据 添加okhttp库的依赖 compile 'com.squareup.okhttp3:okhttp:3.2.0' 修改activity_main.xml <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:...

qq_37196621的博客 2376

ESP32、MicroPython、天问ASR-PRO,串口发送数据并播报

天问ASRPRO语音芯片内置脑神经网络处理器,支持DNN、TDNN、RNN等神经网络及卷积运算硬件运算,非软件运算,支持语音识别、声纹识别、语音增强、语音检测、单麦克风降噪增强、单麦克风回声消除、360度全方位拾音等功能。ASR-PRO可以图形化编程,降低开发难度,对小白友好。之前使用ASRPRO与ESP32进行过语音控制,这次由于一个项目需要对ESP处理过后的数据进行播报,就想到利用该模块。以下程序主要为测试代码,并非实际项目,仅供参考学习(若有错误,欢迎指正)。二者通过串口通信,波特率为9600。

weak_student的博客 5951

WPF MVVM实战:构建可绑定的RichTextBox富文本编辑器

本文详细介绍了如何在WPF MVVM模式下构建可绑定的RichTextBox富文本编辑器,解决标准RichTextBox.Document属性不支持数据绑定的问题。通过创建自定义BindableRichTextBox控件,实现FlowDocument的绑定支持,并分享插入图片、文本格式控制等实战技巧,帮助开发者高效开发富文本编辑功能。

weixin_33717117的博客 307

安卓:网络框架okhttp

OkHttp是一个开源的HTTP客户端库,常用于Android应用程序中进行网络请求。

A125679880的博客 2505

MT5交易软件系统源码

Manager配置的功能及权限:管理客户、开户,销户、入金、信用额度、修改定单、人工交易报表、设定点差、强制平仓、修改密码,设定持仓交割单或挂单小止盈止损点数;26、修改价格 27、更改K线图历史价格 28、同步历史数据;2、系统设置 3、交易管理 4、交易柜台 5、价格更改 6、多台服。务器联机 7、恢复交易历史 8、数据源调整 9、备份服务调整 10、交易市场设定 11、交易单更改 12、平台时间设定(全世界) 13、可添加商品;15、设置商品利息;独立主机(服务器、VPS、VM)

tutujunjun的博客 904

精品连载丨安卓 App 逆向课程之三 frida 注入 Okhttp 抓包上篇

“ 阅读本文大概需要 3 分钟。 ”前言抓包常常是Android协议分析的第一步,抓不到包困扰着众多爬虫工程师,因此很有必要抽丝剥茧,了解和学习Android的网络通信相关知识,并且打算...

静觅 4754

Python 爬虫实战:爬取 Bing 搜索功能链接(国际搜索引擎数据采集技巧)

在当今数字化信息爆炸的时代,搜索引擎已成为我们获取知识、了解世界的得力助手。Bing,作为全球知名的搜索引擎之一,拥有庞大的数据索引和精准的搜索算法。通过 Python 爬虫技术爬取 Bing 搜索区域的链接信息,不仅能帮助我们快速收集大量有价值的数据,还能为后续的数据分析、内容挖掘等任务提供丰富的素材。

yansideyucsdn的博客 1340

Python 爬虫实战:去哪儿网机票价格爬取与出行比价分析

本文介绍了一个基于Python的机票价格监控系统,通过爬取去哪儿网数据实现多航线查询与智能比价。系统采用requests+BeautifulSoup+selenium技术栈,具备以下功能: 实时查询指定航线价格 历史价格追踪与分析 最低价推荐与价格预警 数据可视化展示 文章详细解析了去哪儿网的页面结构和反爬机制,提供了Selenium浏览器的完整配置方案,并实现了一个可稳定运行的机票采集爬虫。该系统能帮助用户掌握价格波动规律,选择最优购票时机,每年可节省可观的出行成本。

u014481728的博客 673

Android OkHttp的用法详解

OkHttp 是一个高效、灵活的 HTTP 客户端库,在 Android 开发中非常常用。下面介绍如何在 Android 中使用 OkHttp,并附上常见的 GET 和 POST 请求示例。OkHttp如果你还没有添加OkHttp,需要在添加依赖:plaintext123implementation("com.squareup.okhttp3:okhttp:4.12.0") // 最新版如果你用的是(Groovy 语法):plaintext123plaintext1。

XHRK1的博客 1638

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

安卓端和后端数据交互之OkHttp3的使用

接触安卓也有一段时间了。无论前后端数据交互,还是安卓端和后端的数据交互都是一样的道理。最基础的发送json,解析json。 一、最先接触到就是okhttp,今天抽个时间来总结一下okhttp的使用吧。盗用一下网上的介绍(手动滑稽) okhttp简介: HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个高效的HTTP客户端,它...

Mr_Van的博客 4267

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android网络通讯之OkHttp

OkHttp是安卓上常用的网络请求框架,不止可以发送http请求,还可以发送socket请求等。官网地址:https://square.github.io/okhttp/

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 7709

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

『Android基础入门』网络编程之OKHTTP与Retrofit框架

网络请求-》java-》OKHTTP数据解析-》java解析-》GSON配合插件解析概述 - OkHttp (square.github.io)HTTP是现代应用程序网络的方式。这就是我们交换数据和媒体的方式。有效地执行 HTTP 会使内容加载速度更快并节省带宽。OkHttp 是一个默认高效的 HTTP 客户端:OkHttp 适用于 Android 5.0+(API 级别 21+)和 Java 8+。框架官网地址 添加网络请求权限添加依赖 由此我们可以知道okhttp框架相较于传统的网络请求的优势:打印测

一个专注于客户端开发的技术er,不定期更新Android,Flutter,HormonyOS等方向的使用心得和感悟 1702
上一篇: Android中Http网络请求响应基本知识
下一篇: Android中Bomb用户体系文档,JSON和GSON解析
FynnJason
博客等级 码龄10年 92粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值