OkHttp是Square公司开发的一款处理网络请求的开源框架。鉴于OkHttp的使用口碑相当不错,Google好像在6.0版本以后直接将其源码引入,并且删除了HttpClient的相关API,可见OkHttp使用之广泛。笔者曾经也使用过,鉴于水平有限,用过之后就抛诸脑后了,所以写一篇文章记录一下,本文不探讨其源码,只是简单的介绍我在项目中的使用过程。

      首先添加依赖

compile 'com.squareup.okhttp:okhttp:3.0.1'
compile 'com.squareup.okio:okio:1.7.0'

     官网对okio的解释是用于快速I/O和可调整的缓冲区。所以在使用OkHttp时加上此依赖。当然,我们使用网络请求还需要在manifest中添加网络权限

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

    GET请求,java代码如下

//创建OkHttpClient对象
                OkHttpClient okHttpClient = new OkHttpClient();
                //创建一个请求,url为访问路径
                Request request = new Request.Builder().url(url).build();
                //发起请求
                okHttpClient.newCall(request).enqueue(new Callback() {
                   @Override
                   public void onFailure(Call call, IOException e) {
                       Log.i(TAG,"IOException--"+e.toString());
                   }

                   @Override
                   public void onResponse(Call call, Response response) throws IOException {
                       Log.i(TAG,"response--"+response.body().toString());
                   }
               });

       我们发现OkHttp更新到3.0+后,不能直接通过OkHttpClient设置超时时间和缓存了,而是通过OkHttpClient.builder来设置。所以我们就不直接new OkHttpClient了,而是通过OkHttpClient的builder的build方法来获取OkHttpClient。后面请求的代码是一样的,就不重复贴出了

OkHttpClient.Builder builder = new OkHttpClient.Builder();
                //连接超时设置
                builder.connectTimeout(10, TimeUnit.SECONDS);
                //写超时
                builder.writeTimeout(20,TimeUnit.SECONDS);
                //读超时
                builder.readTimeout(15,TimeUnit.SECONDS);
                //得到okHttpClient实例
                OkHttpClient okHttpClient = builder.build();

     总结一下,我们使用OkHttp的Get请求步骤就是新建OkHttpClient ,建立Reuest请求,最后call.enqueue()。

POST请求

     与异步GET请求非常类似,只是要封装请求的参数,并传递给Request。

     首先,我们要定义提交数据的类型,比如String,Json等。我们使用MediaType。MediaType在网络协议的消息头里面叫做Content-Type,使用两部分的标识符来确定一个类型。如果想要提交的数据是字符串或者Json,可以写作

//提交数据:Json格式
    private static final MediaType JSON = MediaType.parse("application/json;charset=utf-8");
    //提交字符串
    private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown;charset=utf-8");

     这样就是为了表明我们要传的东西是什么类型,当然还可以传不同类型,这里就不细说了。

Java代码

OkHttpClient okHttpClient = new OkHttpClient();
                //创建请求
                Request request = new Request.Builder()
                    .url(url) //访问路径                       
                    .post(RequestBody.create(MEDIA_TYPE_MARKDOWN,"CONTENT"))//用post方法提交字符串“CONTENT”,根据实际情况提交 
                    .build();
                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 {

                    }
                });

     当然,还有的时候,我们会提交多个数据,我们可以使用post的表单提交,代码都大同小异,我们仅需要以键值对的形式,将数据封装在FormBody里就可以了。Java代码如下:

//建立表单数据
              FormBody.Builder builder = new FormBody.Builder();
                builder.add("name1","value1");//要提交的数据1
                builder.add("name2","value2");//要提交的数据2
                RequestBody build = builder.build();//请求体
                Request request = new Request.Builder()//请求
                        .url(url)
                        .post(build)
                        .build();
                OkHttpClient client = new OkHttpClient();
                Call call = client.newCall(request);
                call.enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {

                    }
                });
            }

     接下来,我们来讲一下用post方法提交json数据,这个应该是项目里经常用到的(接收json,提交json)

首先,我们需要一个MediaType,上面有提到

//提交Json字符串
    private static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json;charset=utf-8");

然后,就是要创建请求体,创建json字符串,java代码如下:

JSONObject object = new JSONObject();
                try {
                    object.put("username","xxxx");
                    object.put("passWord","yyyy");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                String json_String = object.toString();
                RequestBody body = RequestBody.create(MEDIA_TYPE_JSON,json_String);
                Request request =  new Request.Builder()
                        .url(url)
                        .post(body)
                        .build();
                OkHttpClient client = new OkHttpClient();
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {

                    }
                });

好了,就暂时讲到这里,这只是OkHttp最简单的应用,这篇文章只是回顾一下基本用法,有没有发现,每使用一次,都有很多重复的代码。这样肯定不利于我们代码复用,最好的办法就是封装,封装成工具类,用的时候直接调用就可以了。