Android 网络框架 OKHttp3
概述
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下载文件
Android 网络框架 OKHttp3的更多相关文章
- Android网络框架---OkHttp3
1.添加依赖 compile 'com.squareup.okhttp3:okhttp:3.4.2' project Structure-->dependencied/搜索okhttp. com ...
- Android网络框架Volley(体验篇)
Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp ...
- Android网络框架Volley(实战篇)
之前讲了ym—— Android网络框架Volley(体验篇),大家应该了解了volley的使用,接下来我们要看看如何把volley使用到实战项目里面,我们先考虑下一些问题: 从上一篇来看 mQu ...
- Android网络框架-Volley实践 使用Volley打造自己定义ListView
这篇文章翻译自Ravi Tamada博客中的Android Custom ListView with Image and Text using Volley 终于效果 这个ListView呈现了一些影 ...
- Android网络框架Volley
Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp ...
- ym—— Android网络框架Volley(终极篇)
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103).谢谢支持! 没看使用过Volley的同学能够,先看看Android网络框架Volley(体验篇)和 ...
- Android 网络框架 Retrofit2
概述 Retrofit是一个OkHttp网络请求框架的封装库,Retrofit通过注解配置网络参数,可以按照我们的规则去构造实际的HTTP请求,能够灵活设置URL.头部.请求体.返回值等,是目前最优雅 ...
- Android网络框架之Retrofit + RxJava + OkHttp 变化的时代
1.什么是Retrofit框架? 它是Square公司开发的现在非常流行的网络框架,所以我们在导入它的包的时候都可以看到这个公司的名字,目前的版本是2. 特点: 性能好,处理快,使用简单,Retrof ...
- Android网络框架OkHttp之get请求(源码初识)
概括 OkHttp现在很火呀.于是上个星期就一直在学习OkHttp框架,虽然说起来已经有点晚上手了,貌似是2013年就推出了.但是现在它版本更加稳定了呀.这不,说着说着,OkHttp3.3版本在这几天 ...
随机推荐
- 基于LinkedList实现桶排序
需要考虑以下问题: 1.桶的大小,这里我们可以根据输入的元素的个数来确定桶的大小. 2.怎么样确定当前元素进入哪一个桶,这里我们使用到的是通过一个哈希函数来进行计算. int index = (ele ...
- HttpSession的API
//获取Session对象request.getSession()request.getSession(boolean create)//获取SessionIdgetId()//获取当前session ...
- [Swift]LeetCode419. 甲板上的战舰 | Battleships in a Board
Given an 2D board, count how many battleships are in it. The battleships are represented with 'X's, ...
- RabbitQM使用笔记
一:安装 and 卸载 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.r ...
- Xapian索引-文档检索过程分析
本文是Xapian检索过程的分析,本文内容中源码比较多.检索过程,总的来说就是拉取倒排链,取得合法doc,然后做打分排序的过程. 1 理论分析 1.1 检索语法 面对不同的检索业务,我们会有多种检索 ...
- 13.Django1.11.6文档
第一步 入门 检查版本 python -m django --version 创建第一个项目 django-admin startproject mysite 运行 python manage.py ...
- Dockerfile指令介绍
FROM:指定基础镜像 在Dockerfile中FROM是必备的指令,用于指定基础的镜像. FROM centos:latest LABEL:指定镜像标签 LABEL指令用来指定镜像的标签. 格式: ...
- Jenkins时区设置为北京时间
打开 [系统管理]->[脚本命令行]运行下面的命令 System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/ ...
- ImportError: cannot import name UnrewindableBodyError
错误信息: File "/usr/lib/python2.7/site-packages/urllib3/util/__init__.py", line 4, in <mod ...
- Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署
运行环境 照例,先亮底 centos:7.2 cpu:1核 2G内存 1M带宽 辅助工具:xshell xftp 搭建.net core运行环境 .net core 的运行环境我单独写了一篇,请看我的 ...