OkHttp介绍

Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient,HttpURLConnection相对来说比HttpClient难用,google自从2.3版本之后一直推荐使用HttpURLConnection,并且在6.0版本的sdk中直接删掉了HttpClient类。

但是, 上面两个类库和OkHttp比起来就弱爆了, 因为OkHttp不仅具有高效的请求效率,并且节省宽带, 还提供了很多开箱即用的网络疑难杂症解决方案.(据说Android4.4的源码中可以看到OkHttp替换了HttpURLConnection)

  • 支持HTTP/2, HTTP/2通过使用多路复用技术在一个单独的TCP连接上支持并发, 通过在一个连接上一次性发送多个请求来发送或接收数据
  • 如果HTTP/2不可用, 连接池减少请求延迟
  • 支持GZIP, 可以压缩下载体积
  • 响应缓存可以避免重复请求网络
  • 会从很多常用的连接问题中自动恢复,如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP
  • OkHttp还处理了代理服务器问题和SSL握手失败问题

OkHttp基本使用

概述

前面的内容介绍了OkHttp,本章就来教大家okhttp的基本使用,学了这些基本东西之后,大家有其他的需求可以自行扩展。以下的所有请求都是异步请求服务器,在真实的企业开发中,基本都是异步。

  • get请求
  • post请求
  • 文件上传

依赖

Android Studio可以在线依赖,在app/build.gradle文件中加上下面这句话就行

  1. compile 'com.squareup.okhttp3:okhttp:3.8.0'

get请求

首先需要创建一个全局的OkHttpClient对象,所有的Http请求都共用这个对象就行。

  1. private OkHttpClient client = new OkHttpClient();

一般从服务器获取信息的接口都是get请求,这里我们调用获取用户信息接口。

  1. private void getUserInfo(){
  2. //创建一个Request
  3. Request.Builder builder = new Request.Builder().url("http://139.196.35.30:8080/OkHttpTest/getUserInfo.do");
  4. execute(builder);
  5. }
  6. //执行请求
  7. private void execute(Request.Builder builder){
  8. Call call = client.newCall(builder.build());
  9. call.enqueue(callback);//加入调度队列
  10. }
  11. //请求回调
  12. private Callback callback=new Callback(){
  13. @Override
  14. public void onFailure(Call call, IOException e) {
  15. Log.i("MainActivity","onFailure");
  16. e.printStackTrace();
  17. }
  18. @Override
  19. public void onResponse(Call call, Response response) throws IOException {
  20. //从response从获取服务器返回的数据,转成字符串处理
  21. String str = new String(response.body().bytes(),"utf-8");
  22. Log.i("MainActivity","onResponse:"+str);
  23. //通过handler更新UI
  24. Message message=handler.obtainMessage();
  25. message.obj=str;
  26. message.sendToTarget();
  27. }
  28. };
  • 首先创建一个request对象,通过request设置请求url,通过这个类还可以设置更多的请求信息。
  • 然后通过Request去构造一个Call对象。
  • 调用enqueue执行异步请求,有一个参数设置回调。请求成功或者失败会调用Callback接口的onResponse跟onFailure方法,因为这是异步请求,在回调方法中是不能直接更新UI,所以我们需要通过Handler去更新UI。

handler的代码很简单,就是把请求的结果显示在TextView上

  1. private Handler handler=new Handler(){
  2. @Override
  3. public void handleMessage(Message msg) {
  4. String result= (String) msg.obj;
  5. tvResult.setText(result);
  6. }
  7. };

Post请求

通过调用登录接口发送一个post请求。跟get不一样的地方就是传参数不一样,post请求需要把参数封装到RequestBody对象,调用Request对象的post方法把RequestBody传入进去。最后调用execute方法执行请求,这个方法前面get请求的时候讲过。

  1. private void login(){
  2. //把请求参数封装到RequestBody里面
  3. FormBody.Builder formBuilder = new FormBody.Builder();
  4. formBuilder.add("username","ansen");//请求参数一
  5. formBuilder.add("password","123");//请求参数二
  6. RequestBody requestBody = formBuilder.build();
  7. Request.Builder builder = new Request.Builder().url("http://139.196.35.30:8080/OkHttpTest/login.do").post(requestBody);
  8. execute(builder);
  9. }

文件上传

上传文件需要用到MultipartBody对象,通过调用addFormDataPart方法添加表单参数,通过setType方法设置内容类型,这边设置form表单类型,调用自己的getUploadFileBytes方法获取文件byte数组,通过addFormDataPart方法添加文件,后面的流程跟之前的post请求一样。

  1. private void uploadFile(){
  2. MultipartBody.Builder builder = new MultipartBody.Builder();
  3. builder.addFormDataPart("username", "ansen");//表单参数
  4. builder.addFormDataPart("password", "123456");//表单参数
  5. builder.setType(MultipartBody.FORM);
  6. MediaType mediaType = MediaType.parse("application/octet-stream");
  7. byte[] bytes=getUploadFileBytes();//获取文件内容存入byte数组
  8. //上传文件 参数1:name 参数2:文件名称 参数3:文件byte数组
  9. builder.addFormDataPart("upload_file", "ansen.txt",RequestBody.create(mediaType,bytes));
  10. RequestBody requestBody = builder.build();
  11. Request.Builder requestBuider = new Request.Builder();
  12. requestBuider.url("http://139.196.35.30:8080/OkHttpTest/uploadFile.do");
  13. requestBuider.post(requestBody);
  14. execute(requestBuider);
  15. }

如何证明文件有上传到服务器呢?打开浏览器,输入下面这个地址,就能看到文件内容了。如果是本地服务器记得把139.196.35.30改成localhost。

  1. http://139.196.35.30:8080/OkHttpTest/upload/ansen.txt

通过http协议请求服务器数据,常用的就这几种请求,如果有特殊需求自己扩展。例如:下载文件,从服务器下载图片等。。。。

服务器接口

这三个接口的服务器代码是我自己用java web写的,开发工具用的是IntelliJ IDEA,服务器是tomcat,我部署在云上了,139.196.35.30是我的云服务器的外网ip,大家测试也方便。服务器代码我放github上了,如果你想扩展接口,或者想看源码都很方便。

源码下载

服务器源码

Android客户端源码

如果你想第一时间看我的后期文章,扫码关注公众号,每周不定期推送Android开发实战教程文章...

  1. Android开发666 - 安卓开发技术分享
  2. 扫描二维码加关注

OkHttp基本使用的更多相关文章

  1. Android okHttp网络请求之Json解析

    前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...

  2. okhttp封装时,提示 cannot resolve method OkHttpClient setConnectTimeout() 函数

    如标题所示,okhttp封装时,提示 cannot resolve method  OkHttpClient setConnectTimeout() 函数,有遇到这样现象的朋友吗? 原因:因使用的是 ...

  3. RxAndroid+Retrofit+MVVM(1)OKHttp

    1)Gradlecompile 'com.squareup.okhttp:okhttp:2.4.0'compile 'com.squareup.okio:okio:1.5.0' 2)Get //创建o ...

  4. Android okHttp网络请求之Get/Post请求

    前言: 之前项目中一直使用的Xutils开源框架,从xutils 2.1.5版本使用到最近的xutils 3.0,使用起来也是蛮方便的,只不过最近想着完善一下app中使用的开源框架,由于Xutils里 ...

  5. Android okHttp网络请求之文件上传下载

    前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...

  6. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  7. Android okHttp网络请求之Retrofit+Okhttp+RxJava组合

    前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...

  8. 安卓学习----使用okHttp(get方式)---下载图片

    一首先下载Jar包 https://github.com/square/okhttp 如果使用android studio只需要加入依赖 compile 'com.squareup.okhttp3:o ...

  9. Android 框架学习之 第一天 okhttp & Retrofit

    最近面试,一直被问道新技术新框架,这块是短板,慢慢补吧. 关于框架的学习,分几个步骤 I.框架的使用 II.框架主流使用的版本和Android对应的版本 III.框架的衍生使用比如okhttp就会有R ...

  10. OkHttp简介

    什么是OKHttp 一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理.比如可以使用http客户端与第三方服务(如SSO服 ...

随机推荐

  1. Spring整合Quartz定时任务执行2次,Spring定时任务执行2次

    Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...

  2. JAVAEE规范基础知识

    JavaEE规范基础知识 本人博客文章网址:https://www.peretang.com/basic-knowledge-of-javaee-standard/ JavaEE简介 JavaEE,J ...

  3. react+redux+generation-modation脚手架添加一个todolist

    当我遇到问题: 要沉着冷静. 要管理好时间. 别被bug或error搞的不高兴,要高兴,又有煅炼思维的机会了. 要思考这是为什么? 要搞清楚问题的本质. 要探究问题,探究数据的流动. TodoList ...

  4. 在Android Studio上测试运行,Unity发布成Android包的环境搭建步骤

      我用的是unity5.4.3版本,jdk是1.8.0_131版本,Android-SDK是r24.4.1版本,Android-NDK是r13b版本,作者是刚开始写博客,希望对在unity摸索的人有 ...

  5. 使用 Laravel 实现微型博客系统

    参考链接:An Introduction to Laravel Authorization Gates 这个微型博客系统包含两个用户角色(作者 和 编辑),它们的权限如下: 作者能创建博客 作者能更新 ...

  6. Linux的正则表达式grep,egrep

    一.概念 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一组特殊字符,组成一个"规则字符集合",根据用户指定的文本模式对目标文件进行逐行搜索匹配,显示能被模式匹配到的结果. ...

  7. 1004 Let the Balloon Rise

    Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the ...

  8. es6英文文档翻译

    ECMA-262英文文档翻译,github地址: https://github.com/zhoushengmufc/es6 ECMA-262英文文档翻译,在线地址: http://zhoushengf ...

  9. C#集合之字典

    字典表示一种复杂的数据结构,这种数据结构允许按照某个键来访问元素.字典也称为映射或散列表. 字典的主要特性是能根据键快速查找值.也可以自由添加和删除元素,这有点像List<T>(http: ...

  10. W10上面DOSBOX安装

    第一步:下载好MASM.exe.debug.exe.link.exe.将其放在根目录下面.我们以后自己编写的汇编代码也是在此目录下.如图: 第二步:我这里的文件夹名称是Assembly那么这个也就是待 ...