概述

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. Android OpenGL ES 开发(七): OpenGL ES 响应触摸事件

    像旋转三角形一样,通过预设程序来让对象移动对于吸引注意是很有用的,但是如果你想让你的OpenGL图形有用户交互呢?让你的OpenGL ES应用有触摸交互的关键是,扩展你的GLSurfaceView的实 ...

  2. [Swift]LeetCode397. 整数替换 | Integer Replacement

    Given a positive integer n and you can do operations as follow: If n is even, replace n with n/2. If ...

  3. 一文掌握 Linux 性能分析之网络篇(续)

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 这是 Linu ...

  4. Go使用Makefile构建

    ​ 我们平常很多时候都是直接在命令行输入go build进行编译的: go build . 或者测试使用go run运行项目 go run main.go 我看有很多大型开源项目都是如下方式: mak ...

  5. ubuntu18下安装docker

    1.通过指令检查linux内核 uname -a  可以看到大于3.10版本 2.检查是否存在对应目录 ls -l /sys/class/misc/device-mapper 3. apt-get指令 ...

  6. .NET Core 使用 HttpClient SSL 请求出错的解决办法

    问题 使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certificatio ...

  7. 【Docker】(4)搭建私有镜像仓库

    [Docker](4)搭建私有镜像仓库 说明 1. 这里是通过阿里云,搭建Docker私有镜像仓库. 2. 这里打包的镜像是从官网拉下来的,并不是自己项目创建的新镜像,主要测试功能 一.搭建过程 首先 ...

  8. 一步一步教你如何用Python做词云

    前言 在大数据时代,你竟然会在网上看到的词云,例如这样的. 看到之后你是什么感觉?想不想自己做一个? 如果你的答案是正确的,那就不要拖延了,现在我们就开始,做一个词云分析图,Python是一个当下很流 ...

  9. C++实现多级排序

    stl中sort详细说明 实现功能:期末开始4位同学的成绩,按多级排序,排序规则为:按数学从小到大,如果数学相等,则按语文从大到小排列,如果语文相等,则按英语从小到大排列,如果英语相等,则按历史从大到 ...

  10. Kibana安全特性之权限控制

    1.  前言 在之前的例子中,我们都是直接输入地址访问的,系统也没有提示我们要输入用户名密码.但是,在实际使用过程中不大可能所有人都是超级管理员可以做任何操作,一定是有权限控制的,这里我们借助X-Pa ...