>  기사  >  Java  >  Java에서 OkHttp를 사용하는 방법

Java에서 OkHttp를 사용하는 방법

王林
王林앞으로
2023-05-21 17:46:141339검색

OKHttp란 무엇입니까

일반적으로 Java 플랫폼에서는 Apache HttpClient를 Http 클라이언트로 사용하여 HTTP 요청을 보내고 응답을 처리합니다. 예를 들어 http 클라이언트를 SSO 서비스와 같은 타사 서비스와 통합하고 인터넷에서 데이터를 크롤링할 수도 있습니다. OKHttp는 HttpClient와 유사하며 HTTP/2 및 SPDY에 대한 지원을 제공하고 연결 풀링, GZIP 압축 및 HTTP 응답 캐싱 기능을 제공합니다.

OkHttp는 현재 매우 인기 있는 네트워크 라이브러리입니다. 다음 기능:

1. 동일한 호스트 주소를 가진 모든 요청이 동일한 소켓 연결을 공유할 수 있도록 지원합니다.

2. 연결 풀이 요청 지연을 줄입니다.

3. 투명한 GZIP 압축으로 응답 데이터의 크기가 줄어듭니다. 4. 완전히 중복된 요청을 피하기 위해 응답 콘텐츠를 캐시하세요

OkHttp의 기본 사용

    OkHttpClient: 클라이언트 개체
  • Request: 액세스 요청, Post 요청에는 RequestBody
  • RequestBody: 요청 데이터가 포함되어야 합니다.
  • Response는 Post 요청에 사용됩니다. 즉, 네트워크 요청의 응답 결과입니다.
  • MediaType: 데이터 유형, 데이터가 json, image, pdf와 같은 일련의 형식임을 나타내는 데 사용됩니다.
  • client.newCall(request) .execute(): 동기식 요청 방식
  • client.newCall(request).enqueue(Callback callBack): 비동기식 요청 방식이지만 콜백은 하위 스레드에서 실행됩니다. , 따라서 UI 업데이트 작업은 여기에서 수행 할 수 없습니다.
  • ICallBack 인터페이스 구현 필요

     <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>

    비동기 요청 보내기
  • package com.loginsimpl.utils;
    
    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);
    
        }
    }

위 내용은 Java에서 OkHttp를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제