概述

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. [Swift]LeetCode342. 4的幂 | Power of Four

    Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example 1: ...

  2. [Swift]LeetCode404. 左叶子之和 | Sum of Left Leaves

    Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are two l ...

  3. python之zipfile

    1 简述 zip文件是一个常用的归档和与压缩标准. zipfile模块提供了创建.读取.写入.添加及列出zip文件的工具. zipfile里有2个非常常用的class,分别是Zipfile和ZipIn ...

  4. 微信小程序入门(六)

    28.页面路由 框架以栈的形式维护了当前的所有页面. 当发生路由切换的时候,页面栈的表现如下: 路由方式 29.小程序事件流 什么是事件? 事件是视图层到逻辑层的通讯方式 事件可以将用户的行为反馈到逻 ...

  5. BBS论坛(一)

    1.1.项目结构搭建 (1)创建flask项目Perfect_bbs,然后搭建项目结构如下: (2)构建蓝图 cms/views.py # cmd/views.py from flask import ...

  6. ASP.NET Core 2.0 MVC项目实战

    一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还是 ...

  7. 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)

    在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...

  8. asp.net core 系列 11 配置configuration (下)

    四. 文件配置提供程序AddIniFile. AddXmlFile.AddJsonFile FileConfigurationProvider 是从文件系统加载配置的基类. 以下配置提供程序专用于特定 ...

  9. 【斐波那契数列】java探究

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 解析 (1)递归方式 对于公式f(n) = f(n-1) + f(n ...

  10. pymysql.err.InternalError: (1205, 'Lock wait timeout exceeded; try restarting transaction')错误处理

    问题描述: 在使用pymysql库时,利用游标执行插入操作,产生错误,会出现pymysql.err.InternalError: (1205, 'Lock wait timeout exceeded; ...