OkHttp基本使用

作者: Android开发666 | 来源:发表于2017-06-09 15:58 被阅读117次

    OkHttp介绍

    Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient,HttpURLConnection相对来说比HttpClient难用,google自从2.3版本之后一直推荐使用HttpURLConnection,并且在6.0版本的sdk中直接删掉了HttpClient类。

    但是, 上面两个类库和OkHttp比起来就弱爆了, 因为OkHttp不仅具有高效的请求效率,并且节省宽带, 还提供了很多开箱即用的网络疑难杂症解决方案.(据说Android4.4的源码中可以看到OkHttp替换了HttpURLConnection)

    • 支持HTTP/2, HTTP/2通过使用多路复用技术在一个单独的TCP连接上支持并发, 通过在一个连接上一次性发送多个请求来发送或接收数据
    • 如果HTTP/2不可用, 连接池减少请求延迟
    • 支持GZIP, 可以压缩下载体积
    • 响应缓存可以避免重复请求网络
    • 会从很多常用的连接问题中自动恢复,如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP
    • OkHttp还处理了代理服务器问题和SSL握手失败问题

    OkHttp基本使用

    概述

    前面的内容介绍了OkHttp,本章就来教大家okhttp的基本使用,学了这些基本东西之后,大家有其他的需求可以自行扩展。以下的所有请求都是异步请求服务器,在真实的企业开发中,基本都是异步。

    • get请求
    • post请求
    • 文件上传

    依赖

    Android Studio可以在线依赖,在app/build.gradle文件中加上下面这句话就行

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

    get请求

    首先需要创建一个全局的OkHttpClient对象,所有的Http请求都共用这个对象就行。

    private OkHttpClient client = new OkHttpClient();
    

    一般从服务器获取信息的接口都是get请求,这里我们调用获取用户信息接口。

    private void getUserInfo(){
        //创建一个Request
        Request.Builder builder = new Request.Builder().url("http://139.196.35.30:8080/OkHttpTest/getUserInfo.do");
        execute(builder);
    }
    
    //执行请求
    private void execute(Request.Builder builder){
        Call call = client.newCall(builder.build());
        call.enqueue(callback);//加入调度队列
    }
    
    //请求回调
    private Callback callback=new Callback(){
            @Override
            public void onFailure(Call call, IOException e) {
                Log.i("MainActivity","onFailure");
                e.printStackTrace();
            }
    
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //从response从获取服务器返回的数据,转成字符串处理
                String str = new String(response.body().bytes(),"utf-8");
                Log.i("MainActivity","onResponse:"+str);
    
                //通过handler更新UI
                Message message=handler.obtainMessage();
                message.obj=str;
                message.sendToTarget();
            }
    };
    
    
    • 首先创建一个request对象,通过request设置请求url,通过这个类还可以设置更多的请求信息。
    • 然后通过Request去构造一个Call对象。
    • 调用enqueue执行异步请求,有一个参数设置回调。请求成功或者失败会调用Callback接口的onResponse跟onFailure方法,因为这是异步请求,在回调方法中是不能直接更新UI,所以我们需要通过Handler去更新UI。

    handler的代码很简单,就是把请求的结果显示在TextView上

    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            String result= (String) msg.obj;
            tvResult.setText(result);
        }
    };
    

    Post请求

    通过调用登录接口发送一个post请求。跟get不一样的地方就是传参数不一样,post请求需要把参数封装到RequestBody对象,调用Request对象的post方法把RequestBody传入进去。最后调用execute方法执行请求,这个方法前面get请求的时候讲过。

    private void login(){
        //把请求参数封装到RequestBody里面
        FormBody.Builder formBuilder = new FormBody.Builder();
        formBuilder.add("username","ansen");//请求参数一
        formBuilder.add("password","123");//请求参数二
        RequestBody requestBody = formBuilder.build();
    
        Request.Builder builder = new Request.Builder().url("http://139.196.35.30:8080/OkHttpTest/login.do").post(requestBody);
        execute(builder);
    }
    

    文件上传

    上传文件需要用到MultipartBody对象,通过调用addFormDataPart方法添加表单参数,通过setType方法设置内容类型,这边设置form表单类型,调用自己的getUploadFileBytes方法获取文件byte数组,通过addFormDataPart方法添加文件,后面的流程跟之前的post请求一样。

    private void uploadFile(){
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.addFormDataPart("username", "ansen");//表单参数
        builder.addFormDataPart("password", "123456");//表单参数
    
        builder.setType(MultipartBody.FORM);
        MediaType mediaType = MediaType.parse("application/octet-stream");
    
        byte[] bytes=getUploadFileBytes();//获取文件内容存入byte数组
        //上传文件 参数1:name 参数2:文件名称 参数3:文件byte数组
        builder.addFormDataPart("upload_file", "ansen.txt",RequestBody.create(mediaType,bytes));
        RequestBody requestBody = builder.build();
        Request.Builder requestBuider = new Request.Builder();
        requestBuider.url("http://139.196.35.30:8080/OkHttpTest/uploadFile.do");
        requestBuider.post(requestBody);
        execute(requestBuider);
    }
    

    如何证明文件有上传到服务器呢?打开浏览器,输入下面这个地址,就能看到文件内容了。如果是本地服务器记得把139.196.35.30改成localhost。

    http://139.196.35.30:8080/OkHttpTest/upload/ansen.txt
    

    通过http协议请求服务器数据,常用的就这几种请求,如果有特殊需求自己扩展。例如:下载文件,从服务器下载图片等。。。。

    服务器接口

    这三个接口的服务器代码是我自己用java web写的,开发工具用的是IntelliJ IDEA,服务器是tomcat,我部署在云上了,139.196.35.30是我的云服务器的外网ip,大家测试也方便。服务器代码我放github上了,如果你想扩展接口,或者想看源码都很方便。

    源码下载

    服务器源码

    Android客户端源码

          Android开发666 - 安卓开发技术分享
                 扫描二维码加关注
    
    Android开发666

    相关文章

      网友评论

        本文标题:OkHttp基本使用

        本文链接:https://www.haomeiwen.com/subject/salfqxtx.html