(Android网络3)okhttp

前言

okhttp这一个网络通信框架是我第二个学习的网络框架,很多公司也喜欢使用这一个框架,我们公司也使用,所以呢,学习这一套框架是很必要的,因为它可以实现大部分的网络请求,如普通的GET,POST请求,上传,下载,加载图片等..让我们一起来学习吧!!

1.okhttp介绍

okhttp是一个轻量级的框架,由移动支付公司Square公司贡献,目的是用于替代HttpURLConnection和HttpClient

  • okhttp特点

1.允许连接到同一个主机地址的所有请求,提高请求效率
2.共享socket,减少对服务器的请求
3.通过连接池,减少延迟
4.缓存网络数据
5.更少流量消耗
6.Gzip压缩自动处理

  • okhttp功能

1.GET,POST请求
2.文件的上传和下载
3.加载图片(自动压缩)
4.请求回调,支持对象和对象集合
5.session保持

  • okhttp要求

Android2.3及以上,java最低要求1.7

2.okhttp使用

1.添加依赖或者包

AndroidStudio下添加到gradle
    compile 'com.squareup.okhttp3:okhttp:3.9.0'
Eclipse下添加包
/**
     *
     * @param url 请求地址
     */
    public void okHttp_Get_String(String url){

        //构造一个okhttpclient对象
        OkHttpClient client=new OkHttpClient();

        //创建请求,传入访问地址
        Request request=new Request.Builder()
                .url(url)
                .build();
//        通过okhttpclient对象访问这个请求,返回回应
//        方式一,同步,该方法需要放进线程进行请求
//        try {
//            okhttp3.Response response=client.newCall(request).execute();
//            Log.d("result",response.body().string());
//            // TODO: 2017/9/8 success
//        } catch (IOException e) {//这里可能io异常
//             TODO: 2017/9/8 error
//            e.printStackTrace();
//        }

        //方式二,异步,直接调到线程中执行
        Call call=client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, IOException e) {
                // TODO: 2017/9/8 error not UI Thread
                e.printStackTrace();
            }
            @Override
            public void onResponse(@NonNull Call call, @NonNull okhttp3.Response response) throws IOException {
                // TODO: 2017/9/8 success not UI Thread
                //response.body().string()获取字符串String
                //response.body().bytes()获取二进制数组byte[]主要用于图片
                //response.body().byteStream()获取输入流InputStream//主要下载文件
                String result=response.body().string();
                Log.d("result",result);
            }
        });
    }

3.普通的Post请求

1.创建表单body构建器,传入需要post的key和value值,再设置到request请求中

FormBody.Builder fbBody=new FormBody.Builder();
for (Map.Entry<String,String> entry:params.entrySet()){
    fbBody.add(entry.getKey(),entry.getValue());
}

//创建请求,传入访问地址
Request request=new Request.Builder()
                .url(url)
                .post(fbBody.build())
                .build();

2.完整的一个post方法

 /**
     *
     * @param url 请求地址
     * @param params 请求参数
     */
    public String okHttp_Post_String(String url,Map<String,String> params){
        OkHttpClient client=new OkHttpClient();

        //创建表单构建器
        FormBody.Builder fbBody=new FormBody.Builder();
        //添加key和value进表单
        for (Map.Entry<String,String> entry:params.entrySet()){
            fbBody.add(entry.getKey(),entry.getValue());
        }

        //post添加
        Request request=new Request.Builder()
                .url(url)
                .post(fbBody.build())
                .build();
        try {
            okhttp3.Response response=client.newCall(request).execute();
            return  response.body().string();
            // TODO: 2017/9/8 success
        } catch (IOException e) {//这里可能io异常
             TODO: 2017/9/8 error
            e.printStackTrace();
        }
        return null;
    }

4.上传文件

/**
     * 上传文件和表单提交
     * @param url 请求地址
     * @param params 请求参数
     * @param files 文件列表
     */
    public  String okHttp_PostFile_String(String url, Map<String,String> params, List<File> files){
        OkHttpClient client=new OkHttpClient();

        //
        MultipartBody.Builder muliBuilder=new MultipartBody.Builder();

        //添加表单数据
        for (Map.Entry<String,String> entry: params.entrySet()){
            muliBuilder.addFormDataPart(entry.getKey(),entry.getValue());
        }

        //添加上传文件列表
        if (files!=null){
            for (File file:files){
                RequestBody fileBody=RequestBody.create(null,file);
                muliBuilder.addFormDataPart("date",file.getName(),fileBody);
            }
        }

        Request request=new Request.Builder()
                .url(url)
                .post(muliBuilder.build())
                .build();

        try {
            okhttp3.Response response=client.newCall(request).execute();
            return response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值