概述

OKHttp是一个处理网络请求的框架,其优点有,支持http2,对一台机器的所有请求共享同一个socket。

内置连接池,支持连接复用,减少延迟。通过缓存避免重复的请求,请求失败时自动重试主机的其他ip,自动重定向。

添加依赖

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

Get请求

Get方式发送同步请求

OkHttpClient okHttpClient;
Request request;
okHttpClient = new OkHttpClient();
request = new Request.Builder()
.url("http://www.baidu.com")//请求接口,如果需要传参拼接到接口后面,如www.baidu.com?name=zhangsan&sex=18
.build();
final Call call = okHttpClient.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();//得到Response 对象
if(response.isSuccessful()){//判断是否响应
Log.d("response ","响应码"+response.code());//返回http协议的响应码
Log.d("response ","返回内容"+response.body().string());
}
} catch (IOException e) {
e.printStackTrace();
}
}
});

Get方式发送异步请求

OkHttpClient okHttpClient;
Request request;
okHttpClient = new OkHttpClient();
request = new Request.Builder()
.url("http://www.baidu.com")//请求接口。如果需要传参拼接到接口后面,如www.baidu.com?name=zhangsan&sex=18
.build();
final Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) { } @Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){//判断是否响应
Log.d("response ","响应码"+response.code());//返回http协议的响应码
Log.d("response ","返回内容"+response.body().string());
}
}
});

Post请求

FormBody传递键值对参数

FormBody body = new FormBody.Builder() //创建信息主体
.add("name", name)
.add("sex", department)
.add("possword", post)
.add("data", formatter.format(getData()))
.build();

RequestBody传递Json或File对象

//传递Json对象
MediaType JSON = MediaType.parse("application/json; charset=utf-8");//指定数据类型为json对象,
String jsonStr = "{\"username\":\"lisi\",\"nickname\":\"李四\"}";//json数据.
RequestBody body = RequestBody.create(JSON, josnStr); //传递File对象
MediaType fileType = MediaType.parse("File/*");//指定数据类型为file对象,
File file = new File(path);//file对象
RequestBody body = RequestBody.create(fileType , file );

MultipartBody传递键值对对象和 File对象

MultipartBody multipartBody =new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("groupId",""+Id)//添加键值对参数
.addFormDataPart("file",file.getName(),RequestBody.create(MediaType.parse("file/*"), file))//添加文件
.build();

Post同步/异步请求

//FormBody传递数据,Post同步请求
OkHttpClient okHttpClient;
okHttpClient = new OkHttpClient();
FormBody body = new FormBody.Builder() //创建信息主体
.add("name", name)
.add("sex", department)
.add("possword", post)
.add("data", formatter.format(getData()))
.build();
Request requset = new Request.Builder()
.url("url")
.post(body)
.build();
final Call call = okHttpClient.newCall(requset);
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call3.execute();//得到Response 对象
if(response.isSuccessful()){//判断是否响应
Log.d("response ","响应码"+response.code());//返回http协议的响应码
Log.d("response ","返回内容"+response.body().string());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}); //RequestBody()传递数据,Post异步请求
OkHttpClient okHttpClient;
okHttpClient = new OkHttpClient();
MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式,
String jsonStr = "{\"username\":\"lisi\",\"nickname\":\"李四\"}";//json数据.
RequestBody body = RequestBody.create(JSON, jsonStr);
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(body)
.build();
final Call call = okHttpClient.newCall(requset);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) { } @Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){//判断是否响应
Log.d("response ","响应码"+response.code());//返回http协议的响应码
Log.d("response ","返回内容"+response.body().string());
}
}
});

常规请求概述

通过上述代码,Get或Post请求需要实例化OkHttpClient对象,用Request创建请求和Response发送请求,以及Call调度器接收返回内容。

Call对象有两种模式,call.excute()同步模式,call.enqueue()异步模式。

同步是在主线程操作,所以需要开启子线程操作。异步是CallBack回调回来的Response,是在子线程操作,但是回调的onFailure()和onResponse()依然在子线程中。

respinse.body() 也是在子线程,需要接收到内容,才能调用主线程操作。

注意response.body()只能调用一次,因为是输出流的读操作,而读写操作只接收一次,第二次会返回null。

设置网络超时

OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)//设置超时时间
.readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(10, TimeUnit.SECONDS);//设置写入超时时间

OKHttp的拦截器

转载 — 关于OKHttp的拦截器

OKHttp下载文件

转载 — OKHttp下载文件实例

Android 网络框架 OKHttp3的更多相关文章

  1. Android网络框架---OkHttp3

    1.添加依赖 compile 'com.squareup.okhttp3:okhttp:3.4.2' project Structure-->dependencied/搜索okhttp. com ...

  2. Android网络框架Volley(体验篇)

    Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp ...

  3. Android网络框架Volley(实战篇)

      之前讲了ym—— Android网络框架Volley(体验篇),大家应该了解了volley的使用,接下来我们要看看如何把volley使用到实战项目里面,我们先考虑下一些问题: 从上一篇来看 mQu ...

  4. Android网络框架-Volley实践 使用Volley打造自己定义ListView

    这篇文章翻译自Ravi Tamada博客中的Android Custom ListView with Image and Text using Volley 终于效果 这个ListView呈现了一些影 ...

  5. Android网络框架Volley

    Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp ...

  6. ym—— Android网络框架Volley(终极篇)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103).谢谢支持! 没看使用过Volley的同学能够,先看看Android网络框架Volley(体验篇)和 ...

  7. Android 网络框架 Retrofit2

    概述 Retrofit是一个OkHttp网络请求框架的封装库,Retrofit通过注解配置网络参数,可以按照我们的规则去构造实际的HTTP请求,能够灵活设置URL.头部.请求体.返回值等,是目前最优雅 ...

  8. Android网络框架之Retrofit + RxJava + OkHttp 变化的时代

    1.什么是Retrofit框架? 它是Square公司开发的现在非常流行的网络框架,所以我们在导入它的包的时候都可以看到这个公司的名字,目前的版本是2. 特点: 性能好,处理快,使用简单,Retrof ...

  9. Android网络框架OkHttp之get请求(源码初识)

    概括 OkHttp现在很火呀.于是上个星期就一直在学习OkHttp框架,虽然说起来已经有点晚上手了,貌似是2013年就推出了.但是现在它版本更加稳定了呀.这不,说着说着,OkHttp3.3版本在这几天 ...

随机推荐

  1. zookeeper使用详解(命令、客户端、源码)

    1. zookeeper使用详解(命令.客户端.源码) 1.1. 前言   zookeeper我们常用来做分布式协调中间件,很多时候我们都接触不到它的原理和用法,我对他的了解也仅限于知道它可以做分布式 ...

  2. MiniProfiler监控Asp.Net MVC5和EF性能

    1. 安装依赖包 在web项目打开nuget包管理器搜索 MiniProfiler.Mvc5和MiniProfiler.EF6安装. 2. 在Global.asax中添加配置代码 protected ...

  3. 10.Git分支-分支管理(git branch命令)、分支开发工作流

    1.分支管理  git branch 不仅可以创建和删除分支,还可以做一些其他工作. 1.不带参数的 git branch ,得到本地仓库当前的分支列表.并且会显示,当期所在的分支,也就是HEAD所指 ...

  4. Python内置函数(49)——pow

    英文文档: pow(x, y[, z]) Return x to the power y; if z is present, return x to the power y, modulo z (co ...

  5. 花10分钟搞懂开源框架吧 - 【NancyFx.Net】

    NancyFx是什么? Nancy是一个轻量级的独立的框架,下面是官网的一些介绍: Nancy 是一个轻量级用于构建基于 HTTP 的 Web 服务,基于 .NET 和 Mono 平台,框架的目标是保 ...

  6. 以实例说明微服务拆分(以SpringCloud+Gradle)

    前言 之前,我都是说了很多的关于微服务的概念,说到底,很多人看了之后会认为没有什么意思,因为没有实际的东西说明,即使每个概念都明白了,也很难赋之实践.所以这次,我来用一个实际的例子去说明,在实际的项目 ...

  7. SQLServer安装和JDBC连接SQLServer

    SQLServer 安装 参考链接: http://blog.csdn.net/sangjinchao/article/details/62044021?locationNum=6&fps=1 ...

  8. Lambda in Java VS in C#

    核心+变化 “凡是钱能解决的问题,就不是大问题.有很多问题是钱无法解决的,比如生老病死,比如不再相爱.”,看过<蜗居>的朋友一眼就能认出来.虽然这部电视剧讲的是chugui,但是毫无违和感 ...

  9. 磊哥测评之数据库SaaS篇:腾讯云控制台、DMC和小程序

    本文由云+社区发表 作者:腾讯云数据库 随着云计算和数据库技术的发展,数据库正在变得越来越强大.数据库的性能如处理速度.对高并发的支持在节节攀升,同时分布式.实时的数据分析.兼容主流数据库等强大的性能 ...

  10. 为你的Python程序加密

      在实际的工作中,有时候我们需要部署自己的Python应用,但这时候我们并不希望别人能够看到自己的Python源程序.因此,我们需要为自己的源代码进行加密,Python已经为我们提供了这样一套工作机 ...