OkHttp

使用OkHttp

当然我们并不是只能使用HttpURLConnection, 完全没有任何其他选择, 事实上在开源盛行的今天, 有许多出色的网络通信库都可以替代原生的HttpURLConnection, 而其中OkHttp无疑是做得最出色的一个。

OkHttp是由鼎鼎大名的Square公司开发的, 这个公司在开源事业上面贡献良多, 除了OkHttp之外, 还开发了像Picasso、 Retrofit等著名的开源项目。 OkHttp不仅在接口封装上面做得简单易用, 就连在底层实现上也是自成一派, 比起原生的HttpURLConnection, 可以说是有过之而无不及, 现在已经成了广大Android开发者首选的网络通信库。 那么本小节我们就来学习一下OkHttp的用法, OkHttp的项目主页地址是: https://github.com/square/okhttp 。

在使用OkHttp之前, 我们需要先在项目中添加OkHttp库的依赖。 编辑app/build.gradle文件, 在dependencies闭包中添加如下内容:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
}Code language: PHP (php)

添加上述依赖会自动下载两个库, 一个是OkHttp库, 一个是Okio库, 后者是前者的通信基础。

现在直接修改MainActivity中的代码:

@Override
public void onClick(View v) {
    if (v.getId() == R.id.send_request) {
        //sendRequestWithHttpURLConnection();
        sendRequestWithOkHttp();
    }
}

private void sendRequestWithOkHttp() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder()
                        .url("http://www.baidu.com")
                        .build();
                Response response = client.newCall(request).execute();
                String responseData = response.body().string();
                showResponse(responseData);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}Code language: JavaScript (javascript)

如果是发起一条POST 请求会比GET 请求稍微复杂一点, 我们需要先构建出一个RequestBody 对象来存放待提交的参数, 如下所示:

RequestBody requestBody = new FormBody.Builder()
        .add("username", "admin")
        .add("password", "123456")
        .build();Code language: JavaScript (javascript)

然后在Request.Builder中调用一下post() 方法, 并将RequestBody 对象传入:

Request request = new Request.Builder()
        .url("http://www.baidu.com")
        .post(requestBody)
        .build();Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注