Android Okhttp工具类的封装(okhttpUtils)

Android Okhttp工具类

Android Okhttp工具类的封装(okhttpUtils)

近期的项目频繁使用到了网络交互,采用的是第三方类库okhttp
以下是我对okhttp主要使用到的方法进行的封装。
github源码地址:https://github.com/square/okhttp

主要是分为以下三种使用模式(post请求)

  1. post请求(参数+cookie)
  2. post请求(单文件+参数+cookie)
  3. post请求(多文件+参数+cookie)

下面是代码

代码中的变量声明

  private static volatile OkhttpUtil instance;
  private static final String TAG = "OkhttpUtil";
  public static Handler handler = new Handler();
  private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();

双重检测锁-单例模式

 /**
     * 双重检测锁-单例模式
     *
     * @return
     */
    public static OkhttpUtil getInstance() {
        if (instance == null) {
            synchronized (OkhttpUtil.class) {
                if (instance == null) {
                    instance = new OkhttpUtil();
                }
            }
        }
        return instance;
    }

然后是post请求(参数+cookie)

 /**
     * @网络请求--post请求(参数+cookie)
     * url地址,map是参数集合,name是header的key,value是header的value,CallBack回调方法
     */
    public void postParameter(String url, Map<String, String> map, String name, String value, final CallBack callback) {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
            @Override
            public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {//存储用户身份凭证
                cookieStore.put(httpUrl.host(), list);
            }

            @Override
            public List<Cookie> loadForRequest(HttpUrl httpUrl) {
                List<Cookie> cookies = cookieStore.get(httpUrl.host());
                return cookies != null ? cookies : new ArrayList<Cookie>();
            }
        }).build();
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        for (Map.Entry<String, String> entry : map.entrySet()) {//遍历map集合进行添加
            builder.addFormDataPart(entry.getKey(), entry.getValue());
        }
        MultipartBody requestBody = builder.build();
        final Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .header(name, value)//将身份凭证作为头参数,访问时携带发送
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new okhttp3.Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                Log.e(TAG, "onFailure:" + e.getCause().getStackTrace() + e.getMessage());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        callback.onFailed( e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    final String result = response.body().string();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onSuccess( result);
                        }
                    });
                }
            }
        });
    }

下面是post请求(参数+cookie)使用时的代码

 private void post() {
        OkhttpUtil okhttpUtil = new OkhttpUtil();
        String url = "这里是所要访问的url地址;
        Map<String, String> map = new HashMap<>();//参数map集合
        map.put("account", account);//向map集合中添加参数
        map.put("pw", pw);
        okhttpUtil.postParameter(url, map, new CallBack() {
            @Override
            public void onSuccess(String request) {//回调访问成功
                final Gson gson = new Gson();
                loginBean newsBean = gson.fromJson(request, loginBean.class);//解析传回的json数据
                String message = newsBean.getMessage();  //获取传回的message
            }

            @Override
            public void onFailed(Exception e) {//回调访问失败
                Toast.makeText(LoginActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
            }
        });
    }

好了,以上就是post请求(参数+cookie)的使用过程
那么下面就是 post请求(单文件+参数+cookie)了

 /**
     * @网络请求--post请求(单文件+参数+cookie)
     * url地址,map是参数集合,f是文件,name是header的key,value是header的value,CallBack回调方法
     */
    public void postFileCookie(String url, String f, Map<String, String> map, String name, String value, final CallBack callback) {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
            @Override
            public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
                cookieStore.put(httpUrl.host(), list);
            }

            @Override
            public List<Cookie> loadForRequest(HttpUrl httpUrl) {
                List<Cookie> cookies = cookieStore.get(httpUrl.host());
                return cookies != null ? cookies : new ArrayList<Cookie>();
            }
        }).build();
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        for (Map.Entry<String, String> entry : map.entrySet()) {
            builder.addFormDataPart(entry.getKey(), entry.getValue());
        }
        File file = new File(f);
        if (file != null) {
            builder.addFormDataPart("file", file.getName(),
                    RequestBody.create(MediaType.parse("file/*"), file));
        }
        MultipartBody requestBody = builder.build();
        Request request = new Request.Builder()
                .url(url)
                .header(name, value)
                .post(requestBody)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new okhttp3.Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                Log.e(TAG, "onFailure:" + e.getCause().getStackTrace() + e.getMessage());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        callback.onFailed( e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String result = response.body().string();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        callback.onSuccess(result);
                    }
                });
            }
        });
    }

下面是post请求(单文件+参数+cookie)使用时的代码

 private void post() {
        OkhttpUtil okhttpUtil = new OkhttpUtil();
        String url = "这里是所要访问的url地址";
        Map<String, String> map = new HashMap<>();
        map.put("enterprise", "enterprise");//向map集合中添加参数
        map.put("checklogid", checklogid);
        okhttpUtil.postFileCookie(url, savedFile, map, "cookie", "JSESSIONID=" + getToken(), new CallBack() {
            @Override
            public void onSuccess(String request) {//请求成功
                final Gson gson = new Gson();
                updateBean newsBean = gson.fromJson(request, updateBean.class);//解析传回的json数据
                String message = newsBean.getMessage();//获取想要拿到的数据
            }
            @Override
            public void onFailed(Exception e) {//请求失败
                Toast.makeText(getActivity(), "网络错误", Toast.LENGTH_SHORT).show();
            }
        });
    }

以下是post请求(多文件+参数+cookie)

 /**
     * @网络请求--post请求(多文件+参数+cookie)
     *  url地址,map是参数集合,list是文件集合,name是header的key,value是header的value,CallBack回调方法
     */
    public void postFileParameterCookie(String url, Map<String, String> map, List<String> list, String name, String value, final CallBack callback) {
        if (list.size() > 0) {
            OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
                @Override
                public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
                    cookieStore.put(httpUrl.host(), list);
                }

                @Override
                public List<Cookie> loadForRequest(HttpUrl httpUrl) {
                    List<Cookie> cookies = cookieStore.get(httpUrl.host());
                    return cookies != null ? cookies : new ArrayList<Cookie>();
                }
            }).build();
            MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
            for (int i = 0; i < list.size(); i++) {遍历集合中的文件
                File file = new File(list.get(i));
                if (file != null) {
                    builder.addFormDataPart("file", file.getName(),
                            RequestBody.create(MediaType.parse("file/*"), file));
                }
            }
            for (Map.Entry<String, String> entry : map.entrySet()) {
                builder.addFormDataPart(entry.getKey(), entry.getValue());
            }
            MultipartBody requestBody = builder.build();
            Request request = new Request.Builder()
                    .url(url)
                    .header(name, value)//身份标识
                    .post(requestBody)
                    .build();
            Call call = okHttpClient.newCall(request);
            call.enqueue(new okhttp3.Callback() {
                @Override
                public void onFailure(Call call, final IOException e) {//访问失败
                    Log.e(TAG, "onFailure:" + e.getCause().getStackTrace() + e.getMessage());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onFailed(e);
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {//访问成功
                    final String result = response.body().string();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onSuccess(result);
                        }
                    });
                }
            });
        }
    }

下面是post请求(多文件+参数+cookie)使用时的代码

 private void post(List<String> list) {
        String url = "访问的url地址";
        OkhttpUtil okhttpUtil = new OkhttpUtil();
        Map<String, String> map= new HashMap<>();
        map.put("rectifyday", rectifyday);		//向map中添加参数
        map.put("treatmethod", treatmethod);
        okhttpUtil.postFileParameterCookie(url, map, list, "cookie", "JSESSIONID=" + getToken(), new CallBack() {
            @Override
            public void onSuccess(String request) {
                final Gson gson = new Gson();
                updateBean newsBean = gson.fromJson(request, updateBean.class);//解析传回的json数据
                String message = newsBean.getMessage();//获取想要拿到的数据
            }
            @Override
            public void onFailed( Exception e) {
                Toast.makeText(UpdateActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
            }
        });
    }

其中的CallBack是另写的一个接口,代码如下:

public interface CallBack{
    void onSuccess(String request);
    void onFailed(Exception e);
}

以上就是我对okhttp的封装。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OkHttp3是一个用于Android应用程序的网络请求框架,它提供了一个简单而强大的API,可以用来发送和接收HTTP请求。为了更好地使用OkHttp3来进行网络请求,我们可以创建一个OkHttp3工具类。 首先,我们需要在项目中添加OkHttp3的依赖。可以通过在build.gradle文件中引入以下依赖来实现: ``` implementation 'com.squareup.okhttp3:okhttp:4.9.2' ``` 然后,我们可以创建一个OkHttp3工具类,该工具类封装了发送和接收网络请求的相关方法。下面是一个简单的示例: ```java import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import java.io.IOException; public class OkHttp3Utils { private OkHttpClient client; public OkHttp3Utils() { client = new OkHttpClient(); } public void sendRequest(String url, Callback callback) { Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(callback); } } ``` 在这个示例中,我们创建了一个OkHttpClient实例,并提供了一个sendRequest方法来发送网络请求。我们可以将此类实例化并调用sendRequest方法来发送GET或POST请求,并在回调中处理服务器的响应结果。 使用这样的工具类,我们可以更方便地管理和处理网络请求,从而提高Android应用程序的性能和可维护性。当然,还可以根据实际项目的需求来扩展和完善这个工具类,以满足更复杂的网络请求操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值