Java封装OkHttp3工具类

沙海 2021年6月28日01:03:19Java评论21字数 10211阅读34分2秒阅读模式
摘要

Java封装OkHttp3工具类 Java学习者社区

Java封装OkHttp3工具类

Java学习者社区 文章源自JAVA秀-https://www.javaxiu.com/35506.html

Java封装OkHttp3工具类文章源自JAVA秀-https://www.javaxiu.com/35506.html

 作者:如漩涡文章源自JAVA秀-https://www.javaxiu.com/35506.html

https://blog.csdn.net/m0_37701381文章源自JAVA秀-https://www.javaxiu.com/35506.html

Java封装OkHttp3工具类,适用于Java后端开发者文章源自JAVA秀-https://www.javaxiu.com/35506.html

说实在话,用过挺多网络请求工具,有过java原生的,HttpClient3和4,但是个人感觉用了OkHttp3之后,之前的那些完全不想再用了。怎么说呢,代码轻便,使用起来很很很灵活,响应快,比起HttpClient好用许多。当然,这些是我个人观点,不喜勿喷。文章源自JAVA秀-https://www.javaxiu.com/35506.html

准备工作

Maven项目在pom文件中引入jar包文章源自JAVA秀-https://www.javaxiu.com/35506.html

<dependency>    <groupId>com.squareup.okhttp3</groupId>    <artifactId>okhttp</artifactId>    <version>3.10.0</version></dependency><dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>1.2.60</version></dependency>

引入json是因为工具类中有些地方用到了,现在通信都流行使用json传输,也少不了要这个jar包文章源自JAVA秀-https://www.javaxiu.com/35506.html

工具类代码

import com.alibaba.fastjson.JSON;import okhttp3.*;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSocketFactory;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import java.io.IOException;import java.net.URLEncoder;import java.security.SecureRandom;import java.security.cert.X509Certificate;import java.util.LinkedHashMap;import java.util.Map;import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;public class OkHttpUtils {    private static volatile OkHttpClient okHttpClient = null;    private static volatile Semaphore semaphore = null;    private Map<String, String> headerMap;    private Map<String, String> paramMap;    private String url;    private Request.Builder request;    /**     * 初始化okHttpClient,并且允许https访问     */    private OkHttpUtils() {        if (okHttpClient == null) {            synchronized (OkHttpUtils.class) {                if (okHttpClient == null) {                    TrustManager[] trustManagers = buildTrustManagers();                    okHttpClient = new OkHttpClient.Builder()                            .connectTimeout(15, TimeUnit.SECONDS)                            .writeTimeout(20, TimeUnit.SECONDS)                            .readTimeout(20, TimeUnit.SECONDS)                            .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])                            .hostnameVerifier((hostName, session) -> true)                            .retryOnConnectionFailure(true)                            .build();                    addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");                }            }        }    }    /**     * 用于异步请求时,控制访问线程数,返回结果     *     * @return     */    private static Semaphore getSemaphoreInstance() {        //只能1个线程同时访问        synchronized (OkHttpUtils.class) {            if (semaphore == null) {                semaphore = new Semaphore(0);            }        }        return semaphore;    }    /**     * 创建OkHttpUtils     *     * @return     */    public static OkHttpUtils builder() {        return new OkHttpUtils();    }    /**     * 添加url     *     * @param url     * @return     */    public OkHttpUtils url(String url) {        this.url = url;        return this;    }    /**     * 添加参数     *      * @param key   参数名     * @param value 参数值     * @return     */    public OkHttpUtils addParam(String key, String value) {        if (paramMap == null) {            paramMap = new LinkedHashMap<>(16);        }        paramMap.put(key, value);        return this;    }    /**     * 添加请求头     *     * @param key   参数名     * @param value 参数值     * @return     */    public OkHttpUtils addHeader(String key, String value) {        if (headerMap == null) {            headerMap = new LinkedHashMap<>(16);        }        headerMap.put(key, value);        return this;    }    /**     * 初始化get方法     *     * @return     */    public OkHttpUtils get() {        request = new Request.Builder().get();        StringBuilder urlBuilder = new StringBuilder(url);        if (paramMap != null) {            urlBuilder.append("?");            try {                for (Map.Entry<String, String> entry : paramMap.entrySet()) {                    urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).                            append("=").                            append(URLEncoder.encode(entry.getValue(), "utf-8")).                            append("&");                }            } catch (Exception e) {                e.printStackTrace();            }            urlBuilder.deleteCharAt(urlBuilder.length() - 1);        }        request.url(urlBuilder.toString());        return this;    }    /**     * 初始化post方法     *     * @param isJsonPost true等于json的方式提交数据,类似postman里post方法的raw     *                   false等于普通的表单提交     * @return     */    public OkHttpUtils post(boolean isJsonPost) {        RequestBody requestBody;        if (isJsonPost) {            String json = "";            if (paramMap != null) {                json = JSON.toJSONString(paramMap);            }             requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);        } else {            FormBody.Builder formBody = new FormBody.Builder();            if (paramMap != null) {                paramMap.forEach(formBody::add);            }            requestBody = formBody.build();        }        request = new Request.Builder().post(requestBody).url(url);        return this;    }    /**     * 同步请求     *     * @return     */    public String sync() {        setHeader(request);        try {            Response response = okHttpClient.newCall(request.build()).execute();            assert response.body() != null;            return response.body().string();        } catch (IOException e) {            e.printStackTrace();            return "请求失败:" + e.getMessage();        }    }    /**     * 异步请求,有返回值     */    public String async() {        StringBuilder buffer = new StringBuilder("");        setHeader(request);        okHttpClient.newCall(request.build()).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                buffer.append("请求出错:").append(e.getMessage());            }            @Override            public void onResponse(Call call, Response response) throws IOException {                assert response.body() != null;                buffer.append(response.body().string());                getSemaphoreInstance().release();            }        });        try {            getSemaphoreInstance().acquire();        } catch (InterruptedException e) {            e.printStackTrace();        }        return buffer.toString();    }    /**     * 异步请求,带有接口回调     *     * @param callBack     */    public void async(ICallBack callBack) {        setHeader(request);        okHttpClient.newCall(request.build()).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                callBack.onFailure(call, e.getMessage());            }            @Override            public void onResponse(Call call, Response response) throws IOException {                assert response.body() != null;                callBack.onSuccessful(call, response.body().string());            }        });    }    /**     * 为request添加请求头     *     * @param request     */    private void setHeader(Request.Builder request) {        if (headerMap != null) {            try {                for (Map.Entry<String, String> entry : headerMap.entrySet()) {                    request.addHeader(entry.getKey(), entry.getValue());                }            } catch (Exception e) {                e.printStackTrace();            }        }    }    /**     * 生成安全套接字工厂,用于https请求的证书跳过     *     * @return     */    private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {        SSLSocketFactory ssfFactory = null;        try {            SSLContext sc = SSLContext.getInstance("SSL");            sc.init(null, trustAllCerts, new SecureRandom());            ssfFactory = sc.getSocketFactory();        } catch (Exception e) {            e.printStackTrace();        }        return ssfFactory;    }    private static TrustManager[] buildTrustManagers() {        return new TrustManager[]{                new X509TrustManager() {                    @Override                    public void checkClientTrusted(X509Certificate[] chain, String authType) {                    }                    @Override                    public void checkServerTrusted(X509Certificate[] chain, String authType) {                    }                    @Override                    public X509Certificate[] getAcceptedIssuers() {                        return new X509Certificate[]{};                    }                }        };    }    /**     * 自定义一个接口回调     */    public interface ICallBack {        void onSuccessful(Call call, String data);        void onFailure(Call call, String errorMsg);    }}

使用教程

public static void main(String[] args) {    // get请求,方法顺序按照这种方式,切记选择post/get一定要放在倒数第二,同步或者异步倒数第一,才会正确执行    OkHttpUtils.builder().url("请求地址,http/https都可以")            // 有参数的话添加参数,可多个            .addParam("参数名", "参数值")            .addParam("参数名", "参数值")            // 也可以添加多个            .addHeader("Content-Type", "application/json; charset=utf-8")            .get()            // 可选择是同步请求还是异步请求            //.async();            .sync();    // post请求,分为两种,一种是普通表单提交,一种是json提交    OkHttpUtils.builder().url("请求地址,http/https都可以")            // 有参数的话添加参数,可多个            .addParam("参数名", "参数值")            .addParam("参数名", "参数值")            // 也可以添加多个            .addHeader("Content-Type", "application/json; charset=utf-8")            // 如果是true的话,会类似于postman中post提交方式的raw,用json的方式提交,不是表单            // 如果是false的话传统的表单提交            .post(true)            .sync();        // 选择异步有两个方法,一个是带回调接口,一个是直接返回结果    OkHttpUtils.builder().url("")            .post(false)            .async();    OkHttpUtils.builder().url("").post(false).async(new OkHttpUtils.ICallBack() {        @Override        public void onSuccessful(Call call, String data) {            // 请求成功后的处理        }        @Override        public void onFailure(Call call, String errorMsg) {            // 请求失败后的处理        }    });}

结语

封装的明明白白,使用的简简单单,简单的几下就能做请求,用建造者模式是真的舒服文章源自JAVA秀-https://www.javaxiu.com/35506.html

推荐阅读• 知乎高赞:拼多多和国家电网,选哪个?• 外包干三年,必废!• 抖音服务器带宽有多大,才能供上亿人同时刷?• 当Java枚举遇到位掩码,还能这么玩?最近面试BATJ,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。文章源自JAVA秀-https://www.javaxiu.com/35506.html

谢谢支持哟 (*^__^*)文章源自JAVA秀-https://www.javaxiu.com/35506.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
  • 版权声明:本站是JAVA秀团队的技术分享社区,我们会经常分享资源和教程。
  • 转载请注明:Java封装OkHttp3工具类 - JAVA秀 ☜(ˆ▽ˆ)
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定