OkHttp框架 —— GET&POST请求步骤

假如编程易懂得,那么程序员就不会热情地写出注释,也不会有得到编程的快乐。

1.OkHttp简介

OkHttp一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献。

优势:

  • 允许连接到同一个主机地址的所有请求,提高请求效率
  • 共享Socket,减少对服务器的请求次数
  • 通过连接池,减少了请求延迟
  • 缓存响应数据来减少重复的网络请求
  • 减少了对数据流量的消耗
  • 自动处理GZip压缩

功能:

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

那么,这篇博客我会写一下OkHttp的最基本最常使用的功能,就是他的get和post请求的步骤。

2.准备

这次的学习呢,我打算使用AndroidStudio作为开发工具,虽然我还没有接受从Eclipse转到AS,但是我也在慢慢习惯了,以后就抛弃Eclipse,就完全转到AS上来了,强制性习惯!

首先我们新建一个项目,取名为OkHttpDemo,然后我们需要引入okHttp的依赖,我们打开app下的buile.gradle,我们可以找到下面两行代码:

compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'

然后我们在这两行代码之间加入下面这行代码:

compile 'com.squareup.okhttp:okhttp:2.6.0'

然后我们点击右上角出现的“Sync Now”,同步的意思,点击之后AS会为我们自动加载okHttp所需要的jar包,这样第一步准备工作就完成了。

然后,由于我们的okHttp是一个网络请求框架,所以我们需要在AndriodManifest中添加网络权限,代码如下:

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

为了更好的调试代码和养成好的编程习惯,我们编写一个自定义的Log类MyLog,代码如下:

public class MyLog {

private static final String TAG = "okHttp_Demo";
private static boolean debug = true;//开关

public static void e(String msg) {
    if (debug) {
        Log.e(TAG, msg);
    }
}}

自定义的Log只是增加了一个Log打印的开关,如果我们的程序都写完了,我不需要在控制台打印信息,但是我可能还用的着,我们就把debug的值设为false,这样控制台就不会打印Log了!

好,这样我们的准备工作就完成了!

3.GET请求步骤

使用GET请求主要分为四步:

  1. 创建okHttpClient对象
  2. 构造Request
  3. 将Request封装为Call
  4. 执行Call

代码如下:

OkHttpClient okHttpClient = new OkHttpClient();//1.

Request.Builder builder = new Request.Builder();
Request request = builder.get().url("http://www.baidu.com/").build();//2.

Call call = okHttpClient.newCall(request);//3.

call.enqueue(new Callback() {//4.
    @Override
    public void onFailure(Request request, IOException e) {
        }

    @Override
    public void onResponse(Response response) throws IOException {
        }
    }       );

首先我们创建的OkHttpClient是一个全局执行者,它里面配置了各种全局的相关信息,请求动作将由他去执行;然后我们构造了一个Request,它是基于构造者模式的(关于构造者模式可以看一下:构造者模式介绍,其中的url我们使用的是百度的搜索地址;然后我们将Request封装为Call,就是类似于一个Runable,相当于一个可以直接调用的对象;然后我们执行Call,执行Call有两种方法,一种是调用Call对象的execute()方法进行直接调用,另一种就是上面代码中的方法,进行异步执行,我们可以看到,在创建Callback回调接口时,会生成两个方法,onFailure()和onResponse(),很明显他们分别是请求失败和请求成功后执行的方法,在这两个方法内部我们就可以进行一些操作。

然后我们在onFailure()方法内执行以下代码:

MyLog.e("onFailure:" + e.getMessage());
e.printStackTrace();

我们打印请求出错时的信息,关于e.printStackTrace(),它是在命令行打印异常信息在程序中出错的位置及原因,具体介绍可以看一下:e.printStackTrace()介绍
然后我们在onResponse()方法内执行以下代码:

MyLog.e("onResponse:");
final String res = response.body().string();//打印String字符串的信息
MyLog.e(res);

这样,运行程序时就可以在控制台看到打印的网页信息。

接下来,我们在MainActivity的xml文件里编写一个Button按钮:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="doGet"
    android:text="Get" />

我们再在MainActivity.java文件里将监听事件写入:

public void doGet(View view) {}

然后我们将上文的GET请求步骤放入到该方法中,这样我们点击Button,就可以执行get请求了。

好!我们运行程序!
控制台图片1
我们搜索我们的TAG标签okHttp_Demo就可以看到以上信息,我们可以看到打印的是网站的一些标签,好,这样我们的get请求就成功了。

接下来我想让打印的信息显示到一个TextView上,我们创建TextView标签,绑定控件,这里不再赘述代码,我创建的TextView叫做mTvResult,好,那么我们就在onResponse()内,给mTvResult.setText(res);运行程序我们发现闪退了!好,我们观察控制台发现我们在子线程内更新了UI,由此我们可以知道onResponse()方法的回调是在子线程当中的,所以我们需要……看代码:

runOnUiThread(new Runnable() {
       @Override
       public void run() {
          mTvResult.setText(res);
                }
           });

我们使用了runOnUiThread方法使其更新UI,具体runOnUiThread的介绍,请看:runOnUiThread介绍

接下来运行程序,点击GET按钮,就可以看到在TextView上显示的信息了:

手机截图1

这样我们的GET请求就介绍到这里了!

4.POST请求步骤

通get请求不同,post请求需要将参数从url中提取出来再传参数,这里我们使用聚合数据提供的查看水质量的免费接口,接口地址为“http://web.juhe.cn:8080/environment/water/river”,两个参数,一个参数为river流域,一个参数为申请的key值。好,我们先了解这些。

使用post请求分为五步:

  1. 创建okHttpClient对象
  2. 构造RequestBody
  3. 构造Request
  4. 将Request封装为Call
  5. 执行Call

代码如下:

OkHttpClient okHttpClient = new OkHttpClient();//1.

FormEncodingBuilder requestBodyBuilder = new FormEncodingBuilder();
RequestBody requestBody = requestBodyBuilder.add("river", "黄河流域").add("key", "9060141286218b3155f01fd30e01f6db").build();//2.

Request.Builder builder = new Request.Builder();//3.
Request request = builder.url(url_post).post(requestBody).build();

Call call = okHttpClient.newCall(request);//4.

call.enqueue(new Callback() {//5.
     @Override
     public void onFailure(Request request, IOException e) {
         MyLog.e("onFailure:" + e.getMessage());
         e.printStackTrace();
        }

     @Override
     public void onResponse(Response response) throws IOException {
         MyLog.e("onResponse:");
         final String res = response.body().string();
         MyLog.e(res);

         runOnUiThread(new Runnable() {
             @Override
             public void run() {
                    mTvResult.setText(res);
                }
            });

        }
    });

在第二个步骤中,我们创建了一个RequestBody用于传递参数,我们需要用一个FormEncodingBuilder对象来add参数和参数值,所以在创建RequestBody之前创建了一个FormEncodingBuilder;然后我们构造Request的时候,将RequestBody对象作为post()方法的参数传入就可以了;其他步骤与解析与get请求的步骤无异,所以不在赘述。

下面我们也同get那样,编写一个按钮,点击时执行上述代码,然后将信息显示到TextView上,下面我们运行,点击POST:

手机截图2
显示的就是黄河流域的水质量的json了!

好了,这样我们OkHttp框架的GET与POST请求步骤就讲解完了……

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值