赞
踩
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.8.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
package com.frcoder; import com.alibaba.fastjson.JSON; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; 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 Map<String, String> formMap; private Object body; 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"); } } } } /** * 用于异步请求时,控制访问线程数,返回结果 */ private static Semaphore getSemaphoreInstance() { // 只能1个线程同时访问 synchronized (OkHttpUtils.class) { if (semaphore == null) { semaphore = new Semaphore(0); } } return semaphore; } /** * 创建OkHttpUtils */ public static OkHttpUtils builder() { return new OkHttpUtils(); } /** * 添加url */ public OkHttpUtils url(String url) { this.url = url; return this; } /** * 添加body */ public OkHttpUtils body(Object body) { this.body = body; return this; } /** * 添加参数 */ public OkHttpUtils addParam(String key, String value) { if (paramMap == null) { paramMap = new LinkedHashMap<>(16); } paramMap.put(key, value); return this; } /** * 添加参数 */ public OkHttpUtils addFormParam(String key, String value) { if (formMap == null) { formMap = new LinkedHashMap<>(16); } formMap.put(key, value); return this; } /** * 添加请求头 */ public OkHttpUtils addHeader(String key, String value) { if (headerMap == null) { headerMap = new LinkedHashMap<>(16); } headerMap.put(key, value); return this; } /** * 初始化get方法 */ 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方法 */ public OkHttpUtils post() { RequestBody requestBody = null; 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); } if (formMap != null) { FormBody.Builder formBody = new FormBody.Builder(); if (formMap != null) { formMap.forEach(formBody::add); } requestBody = formBody.build(); } if (requestBody == null) { if (body == null) { body = new Object(); } String json = JSON.toJSONString(body); requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json); } request = new Request.Builder().post(requestBody).url(urlBuilder.toString()); return this; } /** * 同步请求 */ public String sync() { setHeader(request); try { Request req = request.build(); System.out.println(req); System.out.println(JSON.toJSONString(req.body())); Response response = okHttpClient.newCall(req).execute(); assert response.body() != null; String resp = response.body().string(); return resp; } catch (IOException e) { e.printStackTrace(); return "请求失败:" + e.getMessage(); } } /** * 异步请求,有返回值 */ public String async() { StringBuilder buffer = new StringBuilder(""); setHeader(request); Request req = request.build(); okHttpClient.newCall(req).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(); } String resp = buffer.toString(); return resp; } /** * 异步请求,带有接口回调 */ public void async(ICallBack callBack) { setHeader(request); Request req = request.build(); System.out.println(JSON.toJSONString(req)); okHttpClient.newCall(req).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添加请求头 */ 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请求的证书跳过 */ 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://baidu.com") .addHeader("Content-Type", "application/json; charset=utf-8") // 有参数的话添加参数,可多个 .addParam("param1", "a") .addParam("param2", "b") // 也可以添加多个 .get() // 可选择是同步请求还是异步请求 //.async(); .sync(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。