文章目录

  • 一 、OKHttp简介
  • 二、 OkHttp3使用
    • 1.创建HTTPClient实例
    • 2.Get请求
    • 3.POST请求
  • 三、Timeouts(超时)

**写在前面:本文只是对OKHttp3的简单实用方法介绍,**网络上有很多类似的文章介绍,而且基于OKHttp封装的工具类也有不少,比如:
鸿洋大神的 [Android 一个改善的okHttp封装库]和 [Android OkHttp完全解析 是时候来了解OkHttp了]以及 [Android Https相关完全解析 当OkHttp遇到Https

还有凯子哥的开源项目OkHttpPlus——支持GET、POST、UI线程回调、JSON格式解析、链式调用、文件上传下**

一 、OKHttp简介

OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献(该公司还贡献了Picasso) ,OKHttp用于替代HttpUrlConnection和HttpClient(android API23 6.0里已移除HttpClient,现在代码提示已经画横线了或者直接打不出来)

OkHttp官网地址:https://square.github.io/okhttp/

官网介绍:
OkHttp works on Android 5.0+ (API level 21+) and on Java 8+.
HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP efficiently makes your stuff load faster and saves bandwidth.

OkHttp is an HTTP client that’s efficient by default:

  • HTTP/2 support allows all requests to the same host to share a socket.
  • Connection pooling reduces request latency (if HTTP/2 isn’t available).
  • Transparent GZIP shrinks download sizes.
  • Response caching avoids the network completely for repeat requests.>

Using OkHttp is easy. Its request/response API is designed with fluent builders and immutability. It supports both synchronous blocking calls and async calls with callbacks.

功能

  1. get,post请求
  2. 文件的上传下载
  3. 加载图片(内部会图片大小自动压缩)
  4. 支持请求回调,直接返回对象、对象集合
  5. 支持session的保持

二、 OkHttp3使用

(一)添加OkHttp依赖文件和网络访问权限。

添加网络访问权限

<uses-permission android:name="android.permission.INTERNET"/>

1.创建HTTPClient实例

简单来说,通过OkHttpClient可以发送一个Http请求,并读取该Http请求的响应,它是一个生产Call的工厂。
此外,受益于一个共享的响应缓存/线程池/复用的连接等因素,绝大多数应用使用一个OkHttpClient实例,便可以满足整个应用的Http请求。

三种创建实例的方法:

// 第一种方法:创建一个默认配置OkHttpClient,可以使用默认的构造函数。

OkHttpClient client = new OkHttpClient();

// 第二种方法:通过new OkHttpClient.Builder()方法来一步一步配置一个OkHttpClient实例。

OkHttpClient clientWith30sTimeout = client.Builder().readTimeout(30, TimeUnit.SECONDS).build();

// 第三种方法: 如果要求使用现有的实例,可以通过newBuilder()方法来进行构造。

OkHttpClient client  = client.newBuilder().build();

2.Get请求

2.1同步GET请求

String url = "http://wwww.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder().url(url).build();
final Call call = okHttpClient.newCall(request);
new Thread(new Runnable() {@Overridepublic void run() {try {Response response = call.execute();Log.d(TAG, "run: " + response.body().string());} catch (IOException e) {e.printStackTrace();}}
}).start();

2.2异步GET请求

//1.创建OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient();//2.创建Request对象,设置一个url地址(百度地址),设置请求方式。Request request = new Request.Builder().url("http://www.baidu.com").method("GET",null).build();//3.创建一个call对象,参数就是Request请求对象Call call = okHttpClient.newCall(request);//4.请求加入调度,重写回调方法call.enqueue(new Callback() {//请求失败执行的方法@Overridepublic void onFailure(Call call, IOException e) {}//请求成功执行的方法@Overridepublic void onResponse(Call call, Response response) throws IOException {}});

注意事项:

  1. 同步GET请求和异步GET请求基本一样,不同地方是同步请求调用Call的execute()方法,而异步请求调用call.enqueue()方法
  2. 异步调用的回调函数是在子线程,我们不能在子线程更新UI,需要借助于 runOnUiThread() 方法或者 Handler 来处理。
  3. 请求成功执行onResponse回调,有一个参数是response
    如果我们想获得返回的是字符串,可以通过response.body().string()获取;
    如果希望获得返回的二进制字节数组,则调用response.body().bytes()
    如果你想拿到返回的inputStream,则调response.body().byteStream(),有inputStream我们就可以通过IO的方式写文件。

2.3异步GET请求下载文件
下载图片、pdf或者音视频等文件是我们经常用到的功能,下载的图片可以保存到本地也可以直接显示在ImageView控件中。

  //1.创建OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient();//2.创建Request对象,设置一个url地址(百度地址),设置请求方式。Request request = new Request.Builder().url("https://www.baidu.com/img/bd_logo1.png").get().build();//3.创建一个call对象,参数就是Request请求对象Call call = okHttpClient.newCall(request);//4.请求加入调度,重写回调方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.e(TAG, "onFailure: "+call.toString() );}@Overridepublic void onResponse(Call call, Response response) throws IOException {//获取字节流InputStream is = response.body().byteStream();int len = 0;//设置下载图片存储路径和名称File file = new File(Environment.getExternalStorageDirectory(),"baidu.png");FileOutputStream fos = new FileOutputStream(file);byte[] buf = new byte[128];while((len = is.read(buf))!= -1){fos.write(buf,0,len);Log.e(TAG, "onResponse: "+len );}fos.flush();fos.close();is.close();}});

如果把下载的图片显示在ImageView控件中,更改一下第四步中onresponse回调方法即可。

@Override
public void onResponse(Call call, Response response) throws IOException {InputStream is = response.body().byteStream();//使用 BitmapFactory 的 decodeStream 将图片的输入流直接转换为 Bitmap final Bitmap bitmap = BitmapFactory.decodeStream(is);//在主线程中操作UIrunOnUiThread(new Runnable() {@Overridepublic void run() {//然后将Bitmap设置到 ImageView 中imageView.setImageBitmap(bitmap);}});is.close();
}

3.POST请求

3.1POST请求提交键值对

 //1.创建OkHttpClient对象OkHttpClient  okHttpClient = new OkHttpClient();//2.通过new FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对 RequestBody  requestBody = new FormBody.Builder().add("name","zhangqilu").add("age","25").build();//3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入Request request = new Request.Builder().url("url").post(requestBody).build();//4.创建一个call对象,参数就是Request请求对象Call call = okHttpClient.newCall(request);//5.请求加入调度,重写回调方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {System.out.println(response.body().string());}});

3.2异步POST请求提交字符串

 MediaType mediaType = MediaType.parse("application/json; charset=utf-8");//"类型,字节码"//字符串String value = "{username:admin;password:admin}"; //1.创建OkHttpClient对象OkHttpClient  okHttpClient = new OkHttpClient();//2.通过RequestBody.create 创建requestBody对象RequestBody requestBody =RequestBody.create(mediaType, value);//3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入Request request = new Request.Builder().url("url").post(requestBody).build();//4.创建一个call对象,参数就是Request请求对象Call call = okHttpClient.newCall(request);//5.请求加入调度,重写回调方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {System.out.println(response.body().string());}});

3.3异步POST提交流

  public static final MediaType MEDIA_TYPE_MARKDOWN= MediaType.parse("text/x-markdown; charset=utf-8");private final OkHttpClient client = new OkHttpClient();public void run() throws Exception {RequestBody requestBody = new RequestBody() {@Override public MediaType contentType() {return MEDIA_TYPE_MARKDOWN;}@Override public void writeTo(BufferedSink sink) throws IOException {sink.writeUtf8("Numbers\n");sink.writeUtf8("-------\n");for (int i = 2; i <= 997; i++) {sink.writeUtf8(String.format(" * %s = %s\n", i, factor(i)));}}private String factor(int n) {for (int i = 2; i < n; i++) {int x = n / i;if (x * i == n) return factor(x) + " × " + i;}return Integer.toString(n);}};Request request = new Request.Builder().url("https://api.github.com/markdown/raw").post(requestBody).build();try (Response response = client.newCall(request).execute()) {if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);System.out.println(response.body().string());}}

3.4异步POST请求上传文件
我们在注册或者修改信息的时候,需要上传一些图片或者txt、word等文档,所以post提交数据。
首先我们要添加存储卡读写权限,在 AndroidManifest.xml 文件中添加如下代码:

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 //1.创建OkHttpClient对象OkHttpClient  okHttpClient = new OkHttpClient();//上传的图片File file = new File(Environment.getExternalStorageDirectory(), "zhuangqilu.png");//2.通过RequestBody.create 创建requestBody对象,application/octet-stream 表示文件是任意二进制数据流RequestBody requestBody =RequestBody.create(MediaType.parse("application/octet-stream"), file);//3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入Request request = new Request.Builder().url("url").post(requestBody).build();//4.创建一个call对象,参数就是Request请求对象Call call = okHttpClient.newCall(request);//5.请求加入调度,重写回调方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {System.out.println(response.body().string());}});

3.5异步POST提交表单

   //1.创建OkHttpClient对象OkHttpClient  okHttpClient = new OkHttpClient();//2.通过new FormBody build() 创建requestBody对象,RequestBody formBody = new FormBody.Builder().add("search", "Jurassic Park").build();//3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入Request request = new Request.Builder().url("url").post(requestBody).build();//4.创建一个call对象,参数就是Request请求对象Call call = okHttpClient.newCall(request);//5.请求加入调度,重写回调方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {System.out.println(response.body().string());}});

3.6异步POST提交分块请求
在个人中心我们可以修改名字,年龄,修改图像,这其实就是一个表单,我们提交多种不同类型的数据,需要利用到MuiltipartBody ,它是RequestBody 的一个子类。
MultipartBuilder可以构建复杂的请求体,与HTML文件上传形式兼容。多块请求体中每块请求都是一个请求体,可以定义自己的请求头。这些请求头可以用来描述这块请求,例如他的Content-Disposition。如果Content-Length和Content-Type可用的话,他们会被自动添加到请求头中。

    //1.创建OkHttpClient对象OkHttpClient  okHttpClient = new OkHttpClient();//上传的图片File file = new File(Environment.getExternalStorageDirectory(), "zhuangqilu.png");//2.通过new MultipartBody build() 创建requestBody对象,RequestBody  requestBody = new MultipartBody.Builder()//设置类型是表单.setType(MultipartBody.FORM)//添加数据.addFormDataPart("username","zhangqilu").addFormDataPart("age","25").addFormDataPart("image","zhangqilu.png",
RequestBody.create(MediaType.parse("image/png"),file)).build();//3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入Request request = new Request.Builder().url("url").post(requestBody).build();//4.创建一个call对象,参数就是Request请求对象Call call = okHttpClient.newCall(request);//5.请求加入调度,重写回调方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});

注意事项

如果提交的是表单,一定要设置表单类型, setType(MultipartBody.FORM)
提交文件 addFormDataPart() 方法的第一个参数就是类似于键值对的键,是供服务端使用的,第二个参数是文件的本地的名字,第三个参数是> RequestBody,里面包含了我们要上传的文件的路径以及 MidiaType。

三、Timeouts(超时)

没有响应时使用超时结束call。没有响应的原因可能是客户点链接问题、服务器可用性问题或者这之间的其他东西。OkHttp支持连接,读取和写入超时。

private final OkHttpClient client;client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build(); Request request = new Request.Builder().url("http://httpbin.org/delay/2") // This URL is served with a 2 second delay..build();Response response = client.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});}

Android客户端连接服务器- OKHttp的简单实用方法相关推荐

  1. Android客户端连接SSM(Spring+SpringMVC+Mybatis)框架Java服务器端

    Android客户端开发越来越流行,但是,Android客户端对应的服务器端采用什么框架呢?对于功能较为简单的应用,我建议,直接采用java web开发最简单的MVC框架即可(很多Android应用的 ...

  2. Windows服务器安全策略配置——简单实用!

    Windows服务器安全策略配置--简单实用! Windows服务器安全策略怎么做?不要觉得这是一个非常深奥遥不可及的问题,其实也是从各个方面去加固系统的安全性而已,它没有一个定论. 我是艾西今天和你 ...

  3. 服务器修改了 金碟软件用不到,金蝶软件金蝶软件KIS系统客户端连接服务器时,有时会有连接不上的情况,提示服务器不是有效的,请重新设置...

    金蝶软件金蝶软件KIS系统客户端连接服务器时,有时会有连接不上的情况,提示服务器不是有效的,请重新设置 金蝶软件KIS系统客户端连接服务器时,有时会有连接不上的情况,提示"服务器不是有效的, ...

  4. 重装金蝶专业版后服务器不显示错误,金蝶软件KIS系统客户端连接服务器时,有时会有连接不上的情况,提示服务器不是有效的,请重新设置...

    金蝶软件KIS系统客户端连接服务器时,有时会有连接不上的情况,提示服务器不是有效的,请重新设置 金蝶软件KIS系统客户端连接服务器时,有时会有连接不上的情况,提示"服务器不是有效的,请重新设 ...

  5. u8系统怎么连接服务器,怎么U8客户端连接服务器

    怎么U8客户端连接服务器 内容精选 换一换 本章节为您介绍以下内容:准备弹性云服务器作为GDS服务器在使用GDS导入导出数据之前,需要准备一台或多台与GaussDB(DWS) 集群在相同VPC内的Li ...

  6. 虚拟机客户端怎么连接服务器,虚拟机客户端连接服务器

    虚拟机客户端连接服务器 内容精选 换一换 本章节指导您使用MongoDB客户端和Robo 3T工具,通过公网连接集群实例.通过MongoDB客户端和Robo 3T工具连接实例的方式有普通连接和SSL连 ...

  7. Android中MaterialSearchView(搜索框)的简单实用

    Android中MaterialSearchView(搜索框)的简单实用 收搜框架有好多,动画效果满炫酷的就是代码太多,没发抽取他的搜索功能,而这个却比较好用些,直接从代码里面抠出来一个简单实现搜索功 ...

  8. t3客户端连接服务器就未响应,t3标准版客户端连接服务器方法

    t3标准版客户端连接服务器方法 内容精选 换一换 SSL证书是一种遵守SSL协议的服务器数字证书,可以在客户端和服务器端之间建立加密通道,保证数据在传输过程中不被窃取或篡改.为了提高数据安全性,Gau ...

  9. socket多客户端连接服务器

    socket多客户端连接服务器     关于套接字编程,我们可以使用它来完成网络通信,而关于使用socket来实现多客户端连接服务器,我记录了以下东西.     一.基本思路        1.服务器 ...

最新文章

  1. 金蝶加密服务器显示339错误,打开金蝶软件出现这个提示怎么解决???
  2. Python之Python 安装环境搭建
  3. 常见的面试思考题(MARK)
  4. php mysql模糊查询数组,php – 使用数组的MySQL查询
  5. hadoop关键进程
  6. STM32-IO引脚复用-原理和使用
  7. Ajax的JSP示例以及相关知识介绍,适合于入门者
  8. python祝福祖国代码_C语言-笔记一
  9. C++左值与右值,移动与完美转发
  10. 微博 用户画像_面向新浪微博的用户画像研究
  11. android网页抓取,手把手教学 Android 使用 jsoup 抓取网页数据
  12. 利用Python爬取公交地铁数据(TransBigData版)
  13. 嵌入式常见英文2500词总结
  14. 关于博客笔记大汇总,持续更新迭代
  15. [转]日月悠长,山河无恙,行者无疆
  16. Mybatis01_基础详细入门案例
  17. Windows垃圾文件清理(批处理BAT清理垃圾文件)
  18. antv x6画布内容居中
  19. Java Robocode 以示例wall为基准的一个坦克
  20. 篮球服务器维修,永劫无间服务器,瘫痪6小时未恢复惹众怒,法神:最少十个箱子摆平...

热门文章

  1. MES 系统价格多少钱?企业如何甄选MES 厂商?
  2. 数据中台 第8章 数据资产管理
  3. 汉字风格迁移篇---MF-NET一种新颖的少镜头风格化多语言字体生成
  4. webpack合成sprite图
  5. 考研计算机学硕370分,考研370分是什么水平??
  6. 计算机考研abc区划分,考研abc区有什么区别
  7. css 下拉框 下三角形
  8. Mvvm模式: Databinding 与 ViewModel+LiveData+Repository
  9. PLC通讯实现-C#实现AB5000 PLC以太网通讯DTL32(八)
  10. django 重置密码