Android OkHttp3网络请求框架使用入门

OkHttp

An HTTP & HTTP/2 client for Android and Java applications.


概述


HTTP是现代应用的网络。这是我们交换数据和媒体的媒介。使用HTTP有效提高加载的速度和节省带宽。



OkHttp是一种更有效率的HTTP客户端:

  • HTTP/2支持允许发向相同主机的请求分享一个套接字;
  • 连接池减少请求的延迟(如HTTP / 2不可用);
  • 透明的gzip收缩下载大小;
  • 响应缓存避免了重复请求。

概括起来说OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。

下载配置


Jar方式:
okhttp-3.4.1.jar
你也需要Okio, okhttp采用其快速I/O和可调整大小的缓冲区。Okio的最新Jar下载.

Maven方式:

<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>3.4.1</version>
</dependency>

GRADLE方式

compile 'com.squareup.okhttp3:okhttp:3.4.1'

使用


OkHttp支持同步&异步获得数据

1. 同步get

new Thread(new Runnable() {
    @Override
    public void run() {

        //1. 得到OKHttpClient对象
        OkHttpClient okHttpClient = new OkHttpClient();
        //2. 获取Request对象 ,内部也是通过建造者模式去封装的一些请求参数
        Request request = new Request.Builder()
            .url(url)
            .build();
        //3. 获取Call对象
        Call call = okHttpClient.newCall(request);
        //4. 获取Response对象
        try {
            Response response = call.execute();
            //响应体
            ResponseBody body = response.body();
            //可以根据自己的需要,返回相应的类型:
            //可以返回byte数组, 可以返回 InputStream ,可以返回 字符串
            // byte[] bytes = body.bytes();
            //InputStream inputStream = body.byteStream();
            final String result = body.string();  //注意这里是string()方法,不要写成toString()

            // 这个方法执行在主线程当中
            // 如果 当前的动作,在主线程中会立即执行
            // 如果 当前的动作在子线程中,会先发送到主线程中,然后去执行
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mTvResult.setText(result);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

2. 异步get

//1. 得到OKHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2. 获取Request对象
Request request = new Request.Builder()
    .url(Constant.URL_GET_ASYNC)
    .build();
//3. 获取Call对象
Call call = okHttpClient.newCall(request);
//4. 获取Response对象, 通过接口回调方式返回Response
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        //TODO 请求失败逻辑在这里处理
        //TODO 注意:这里边都是子线程,所以要更改UI的时候需要发送到主线程才OK
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        //TODO 请求成功时候
        //TODO 注意:这里边都是子线程,所以要更改UI的时候需要发送到主线程才OK
        String result = response.body().string();
    }
});

3.同步post

new Thread(new Runnable() {
    @Override
    public void run() {
        //1. 得到OKHttpClient
        OkHttpClient okHttpClient = new OkHttpClient();
        //2. 得到RequestBody对象,通过FormBody.Builder()来获取,通过add方法提交键值对
        RequestBody body = new FormBody.Builder()
            .add("key1", "value1")
            .add("key2", "value2")
            .build();
        //3. 创建Request对象
        Request request = new Request.Builder()
            .url(url)
            .post(body)
            .build();
        //4. 得到Call对象
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            if (response.isSuccessful()) {
                final String result = response.body().string();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mTvResult.setText(result);
                    }
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

异步post

OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
    .add("key1", "value1")
    .add("key2", "value2")
    .build();
Request request = new Request.Builder()
    .url(url)
    .post(requestBody)
    .build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        //TODO 失败的,在子线程中
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        //TODO 成功时,在子线程中。
    }
});

提交json数据

OkHttpClient okHttpClient = new OkHttpClient();
//创建RequetBody对象, 这里注意:不论什么类型的Post请求,只是 RequestBody获取的方式不一样,其他步骤的一模一样
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
RequestBody requestBody = RequestBody.create(mediaType, YOURJSONSTRING);
//获取Request对象
Request request = new Request.Builder()
    .url(url)
    .post(requestBody)
    .build();
//获取Call对象
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 {
    }
});



(完毕)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值