OkHttp简单封装

本文详细介绍了如何使用OkHttp库进行网络请求,包括添加依赖、定义接口、实现异步和同步GET/POST请求,以及创建网络管理类和对外提供调用的方法。同时,展示了如何在Android应用中配置网络权限和安全策略,以及处理JSON响应数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、添加okhttp引用

implementation 'com.squareup.okhttp3:okhttp:3.12.0'

2、新建一个请求接口

public interface INetManager {

//    异步get
    void get(String url,INetCallBack callBack);
//    同步get
    void get(String url,GetCallBack netCallBack) throws IOException;
//    同步post
      Response post(String url, Map<String,String> bodyParams) throws IOException;
//    异步post
    void post(String url, Map<String,String> bodyParams,Map<String,String> headersParams,INetCallBack callBack);
}

3、get和post异步请求响应接口

public interface INetCallBack {

    void success(String response);

    void failed(Throwable throwable);
}

3.1、get同步请求响应接口

public interface GetCallBack {

    void success(Response response);

    void failed(Throwable throwable);
}

4、新建一个网络管理类

public class OkHttpINetManager implements INetManager {

//    绑定ui线程
    private static Handler sHandler=new Handler(Looper.getMainLooper());

    private static OkHttpClient  sOkhttpClient;
    static {

        OkHttpClient.Builder builder=new OkHttpClient.Builder();
        builder.readTimeout(30, TimeUnit.SECONDS);//读取超时
        builder.connectTimeout(10, TimeUnit.SECONDS);//连接超时
        builder.writeTimeout(60, TimeUnit.SECONDS);//写入超时
        sOkhttpClient = builder.build();
//        TrustManagerFactory trustManagerFactory = null;
//        try {
//            trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
//            trustManagerFactory.init((KeyStore) null);
//            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
//            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
//                throw new IllegalStateException("Unexpected default trust managers:"
//                        + Arrays.toString(trustManagers));
//            }
//            X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
//            SSLContext sslContext = SSLContext.getInstance("TLS");
//           sslContext.init(null, new TrustManager[] { trustManager }, null);
//           SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

//            builder.sslSocketFactory(sslSocketFactory,trustManager);
//            builder.hostnameVerifier(new HostnameVerifier() {
//                @Override
//                public boolean verify(String hostname, SSLSession session) {
//                    return false;
//                }
//            });

//        } catch (Exception e) {
//            e.printStackTrace();
//        }

    }

    /**
     * call.execute();
     * 同步GET请求   因为是耗时操作,要在子线程里执行 new Thread(new Runnable())
     * @param url 请求链接
     * @param netCallBack
     * @throws IOException
     */
    public void get(String url,GetCallBack netCallBack) throws IOException {
        //创建okHttpClient对象
        OkHttpClient mOkHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .get()//默认get,可省略
                .url(url)
                .build();
        Call call = mOkHttpClient.newCall(request);
        //请求加入调度
        Response response = call.execute();
        netCallBack.success(response);
        // response.body().string();
    }
    /**
     * 异步get
     * @param url
     * @param callBack
     */
    @Override
    public void get(String url, final INetCallBack callBack) {

        Request.Builder builder=new Request.Builder();
        final Request request = builder.get().url(url).build();
        Call call = sOkhttpClient.newCall(request);
//        同步
//        Response response = call.execute();
//        异步
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {

                sHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callBack.failed(e);
                    }
                });
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
              try {
                  final String string = response.body().string();
                  sHandler.post(new Runnable() {
                      @Override
                      public void run() {
                          callBack.success(string);
                      }
                  });
              }catch (Throwable e){
                  e.printStackTrace();
                  callBack.failed(e);
              }
            }
        });
    }
    /**
     * 同步POST请求
     * @param url
     * @param bodyParams
     * @return
     */
    public Response post(String url, Map<String,String> bodyParams) throws IOException {
        RequestBody body = getBodyParams(bodyParams);
        Request.Builder builder = new Request.Builder();
        Request request = builder.post(body)
                .url(url)
                .build();
        Call call = sOkhttpClient.newCall(request);
        //请求加入调度
        Response response = call.execute();
        return response;
    }
    /**
     * 异步post
     * @param url
     * @param bodyParams
     * @param headersParams
     * @param callBack
     */
    @Override
    public void post(String url, Map<String, String> bodyParams,Map<String,String> headersParams, INetCallBack callBack) {

        Request.Builder builder=new Request.Builder();
        final Request request = builder.post(getBodyParams(bodyParams))
                .url(url)
                .headers(getRequestHeaders(headersParams))
                .build();
        Call call = sOkhttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });

    }
    /**
     * 添加请求头
     * @param hedersParams
     * @return
     */

    private Headers getRequestHeaders(Map<String,String> hedersParams){
        Headers headers = null;
        Headers.Builder builder = new Headers.Builder();
        if (hedersParams != null){
            Iterator<String> iterator = hedersParams.keySet().iterator();
            while (iterator.hasNext()){
                String key = iterator.next();
                builder.add(key,hedersParams.get(key));
            }
        }
        headers = builder.build();
        return headers;
    }

    /**
     * 设置请求参数
     * @param bodyParams
     * @return RequestBody
     */
    private RequestBody getBodyParams(Map<String,String> bodyParams) {
        RequestBody body = null;
        FormBody.Builder formBody = new FormBody.Builder();
        if (bodyParams != null) {
            Iterator<String> iterator = bodyParams.keySet().iterator();
            String key = "";
            while (iterator.hasNext()) {
                key = iterator.next().toString();
                formBody.add(key, bodyParams.get(key));
            }
        }
        return formBody.build();
    }

}

5、新建一个对外的类供外部调用

public class AppUpdater {

    private static AppUpdater instance = new AppUpdater();

    //网络请求,下载
   private INetManager netManager=new OkHttpINetManager();

//   如果更换网络框架可以调用此方法
   public void setNetManager(INetManager manager){
       netManager=manager;
   }
   public INetManager getNetManager(){
        return netManager;
   }
    public static AppUpdater getInstance(){
        return instance;
    }
}

6、清单文件添加网络权限

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

Android 9.0网络请求还要添加:

6.1、在res目录里新建一个xml 包

在这个包中新建一个network_security_congig.xml文件(名字随便起)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

6.2、在清单文件的application节点下调用

android:networkSecurityConfig="@xml/network_security_config"

7、请求

地址:public String url="http://59.110.162.30/app_updater_version.json";

  TextView updateApp = (TextView) findViewById(R.id.download);

        updateApp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AppUpdater.getInstance().getNetManager().get(url, new INetCallBack() {
                    @Override
                    public void success(String response) {
                        Log.d("===", "success: "+response);
//                        解析json
//                        把json的解析放到DownLoadBeen,没必要暴露出去,
                        DownLoadBeen been=DownLoadBeen.parse(response);
                        Toast.makeText(MainActivity.this,been.content,Toast.LENGTH_SHORT).show();
                    }
                    @Override
                    public void failed(Throwable throwable) {
                        Log.d("===", "failed: "+throwable);
                        Toast.makeText(MainActivity.this,"版本更新失败",Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

8、解析json  (json解析成对象)

新建一个json实体类

public class DownLoadBeen implements Serializable{


    /**
     * title : 4.5.0更新啦!
     * content : 1. 优化了阅读体验;
     2. 上线了 hyman 的课程;
     3. 修复了一些已知问题。
     * url : http://59.110.162.30/v450_imooc_updater.apk
     * md5 : 14480fc08932105d55b9217c6d2fb90b
     * versionCode : 450
     */

    public String title;
    public String content;
    public String url;
    public String md5;
    public String versionCode;
    /**
     * 将json解析成对象
     * @param response
     * @return
     */
    public static DownLoadBeen parse(String response) {

        try {
            JSONObject jsonObject=new JSONObject(response);
            String title = jsonObject.optString("title");
            String content = jsonObject.optString("content");
            String url = jsonObject.optString("url");
            String md5 = jsonObject.optString("md5");
            String versionCode = jsonObject.optString("versionCode");

            DownLoadBeen been=new DownLoadBeen();

            been.title=title;
            been.content=content;
            been.url=url;
            been.md5=md5;
            been.versionCode=versionCode;

            return been;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
}

持续更新中。。。

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_26554909

有您的支持,我们将做的更好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值