OkHttp GET 和 POST 的使用

来源:互联网 发布:c3p0连接池配置优化 编辑:程序博客网 时间:2024/05/01 11:53

1 OkHttp 介绍

Android 开发,不可避免的会用到网络技术,而多数情况下,我们都是使用 HTTP 协议来发送和接收网络数据。Android 系统主要提供两种方式来进行 HTTP 通信,HttpURLConnection 和 HttpClient,但是从 Android 2.3 及以后版本中,Google 推荐使用 HttpURLConnection,究其原因,就是由于 HttpClient 的 API 数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前 Android 团队在提升和优化 HttpClient 方面的工作态度并不积极。HttpURLConnection 是一种多用途、轻量极的 HTTP 客户端,使用它来进行 HTTP 操作可以适用于大多数的应用程序。虽然 HttpURLConnection 的 API 提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。

但也正是因为这样,HttpURLConnection 的使用还是比较复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码,于是乎,一些Android 网络通信框架也就应运而生,今天要讲的就是 OkHttp 开源框架。

OkHttp 可以做很多事,包括上传字符串、上传文件、上传流、上传表格参数、上传多部分的请求、响应 Json、响应缓存等。目前主要流行 Json 数据通信,所以我们就来讲讲基于 Json 通信的 GET 和 POST 请求与响应。

2 下载 OkHttp

  1. 介绍了这么多理论知识,接下来就进入实战阶段了,首先下载 OkHttp 的 jar 包,可以去 GitHub 下载最近的包。

    这是最新下载地址:https://search.maven.org/remote_content?g=com.squareup.okhttp3&a=okhttp&v=LATEST 
    当然,你也可以在项目中直接添加编译(用于 Android Studio):compile 'com.squareup.okhttp3:okhttp:3.2.0' 
    OkHttp 的项目地址:https://github.com/square/okhttp

  2. 除此之外,还需要添加一个 OkHttp 的依赖包:okio.jar,下载地址:https://search.maven.org/remote_content?g=com.squareup.okio&a=okio&v=LATEST 
    项目地址:https://github.com/square/okio 
    编译地址:compile 'com.squareup.okio:okio:1.6.0'

3 GET 请求

我们从最简单的 Http 请求开始学起,首先需要获取一个 OkHttpClient 对象,方法如下:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:12px;">OkHttpClient mHttpClient = new OkHttpClient();</span>  

OkHttpClient 用于管理所有的请求,内部支持并发,所以我们不必每次请求都创建一个 OkHttpClient 对象,这是非常耗费资源的。接下来就是创建一个 Request 对象了,如下所示:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:12px;">Request request = new Request.Builder()  
  2.     .url("http://www.baidu.com")  
  3.     .build();</span>  

下面实现从网络下载图片的完整代码:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:12px;">public static void main(String[] args) throws IOException {  
  2.         //1, 导包  
  3.         //2, 得到OkHttp的客户端  
  4.         OkHttpClient client = new OkHttpClient();  
  5.         //3, 发起新的请求, 得到响应对象  
  6.         Request request = new Request.Builder()  
  7.                             .url("https://www.baidu.com/img/2016_8_17chinabetter_dec3fa87715c772207eb75f292100578.png")  
  8.                             .build();  
  9.           
  10.         Response response = client.newCall(request).execute();  
  11.         if(response.isSuccessful())  
  12.         {  
  13.             //获取要访问资源的byte数组  
  14.             byte[] arr = response.body().bytes();  
  15.             FileOutputStream fos = new FileOutputStream("d:/bd.jpg");  
  16.             fos.write(arr);  
  17.             fos.close();  
  18.             System.out.println("图片下载成功!!!!!");  
  19.         }  
  20.     }  
  21. </span>  

4 POST 请求

大家都知道 http 常用的请求分为 GET 和 POST 请求,刚才我们使用的明显是一个 GET 请求,那么,如何发起一个 POST 请求呢?其实很简单,在第二步中有一个 post 方法,就可以传入请求参数。

首先,创建一个 RequestBody 对象,这里我们用它的一个子类 FormBody 创建一个表单数据参数,如下所示:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. //表单数据  
  2. FormBody.Builder builder = new FormBody.Builder();  
  3. builder.add("xwdoor","xwdoor");  
  4. RequestBody formBody = builder.build();  
然后以此构建 Request 对象,如下所示:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:12px;">Request request = new Request.Builder()  
  2.   
  3.     .url("http:www.baidu.com")  
  4.     .post(formBody)  
  5.     .build();</span>  

调用 post() 方法,将创建的 RequestBody 对象传入即可。开始请求与前面讲的 GET 请求一样。实现 POST 请求大概分四步:
  1. 创建 OkHttpClient 对象
  2. 创建 RequestBody 对象
  3. 创建 Request 对象
  4. 将 Request 对象添加到 OkHttpClient 中,并传入回调函数。
完整实例:
[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:12px;">public static void main(String[] args) throws IOException {   
  2.         //1, 导包   
  3.         //2, 的到客户端  
  4.         OkHttpClient client = new OkHttpClient();  
  5.           
  6.         //3, 发起新的请求,获取返回信息  
  7.         RequestBody body = new FormBody.Builder()  
  8.                             .add("useName""abc")//添加键值对  
  9.                             .add("usePwd""321")  
  10.                             .build();  
  11.         Request request = new Request.Builder()  
  12.                             .url("http://localhost:8080/Day_28_Servlet/LoginServlet")  
  13.                             .post(body)  
  14.                             .build();  
  15.         Response response = client.newCall(request).execute();  
  16.         if(response.isSuccessful())  
  17.         {  
  18.             String str = response.body().string();  
  19.             System.out.println("服务器响应为: " + str);  
  20.         }  
  21.     }</span>  
转自:http://blog.csdn.net/xwdoor/article/details/51063673
0 0