okhttp的使用
依赖
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version> </dependency>
工具类
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.InetSocketAddress; import java.net.Proxy; 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<T> { private static volatile OkHttpClient okHttpClient = null; private static volatile Semaphore semaphore = null; private Map<String, String> headerMap; private Map<String, String> paramMap; private String req; private String url; private Request.Builder request; /** * 初始化okHttpClient,并且允许https访问 */ private OkHttpUtils() { if (okHttpClient == null) { synchronized (OkHttpUtils.class) { if (okHttpClient == null) { //设置代理方式 //Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8080)); TrustManager[] trustManagers = buildTrustManagers(); okHttpClient = new OkHttpClient.Builder() //设置连接超时时间 .connectTimeout(15, TimeUnit.SECONDS) //写入超时时间 .writeTimeout(20, TimeUnit.SECONDS) //从连接成功到响应的总时间 .readTimeout(20, TimeUnit.SECONDS) //跳过ssl认证(https) .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0]) .hostnameVerifier((hostName, session) -> true) .retryOnConnectionFailure(true) // .proxy(proxy)//代理ip //设置连接池 最大连接数量 , 持续存活的连接 .connectionPool(new ConnectionPool(50, 10, TimeUnit.MINUTES)) .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; } /** * 添加参数,放入paramMap中 * * @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 T ,post请求时将入参转为json字符串 * @return */ public OkHttpUtils addParam(T t) { req = JSON.toJSONString(t); 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); } if(req != null){ json = req; } 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; } public OkHttpUtils put() { String json = ""; if (paramMap != null) { json = JSON.toJSONString(paramMap); } RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json); request = new Request.Builder().put(requestBody).url(url); return this; } public OkHttpUtils del() { String json = ""; if (paramMap != null) { json = JSON.toJSONString(paramMap); } RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json); request = new Request.Builder().delete(requestBody).url(url); return this; } /** * 同步请求 * 返回response,可以获取响应头信息 * @return */ public Response sync() { setHeader(request); Response response = null; try { response = okHttpClient.newCall(request.build()).execute(); assert response.body() != null; return response; } catch (IOException e) { e.printStackTrace(); //return "请求失败:" + e.getMessage(); } return response; } /*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); } }
测试代码
get请求
public static void main(String[] args) throws IOException { Response response = OkHttpUtils.builder().url("http://www.baidu.com") .addHeader("test", "test000") .addParam("test1", "test111") .addParam("test2", "test222") .get().sync(); String res = response.body().string(); System.out.println("请求返回结果:"+ res.substring(0,50)); System.out.println("请求头结果:"+response.headers().toString().substring(0,50)); System.out.println("获取某一个请求头:"+response.header("Content-Type")); }
get请求,接口返回对象
@RestController public class OkHttpTest { @GetMapping("okHttpTest1") public Student test01(){ Student stu = new Student(); stu.setName("小明"); stu.setAge(20); return stu; } }
public class OkhttpTest { public static void main(String[] args) throws IOException { Response response = OkHttpUtils.builder().url("http://localhost:8080/okHttpTest1") .addHeader("test", "test000") .addParam("test1", "test111") .addParam("test2", "test222") .get().sync(); String res = response.body().string(); System.out.println("请求返回结果:"+ res); System.out.println("请求头结果:"+response.headers()); System.out.println("获取某一个请求头:"+response.header("Content-Type")); } }
POST请求
分步组装json入参
@PostMapping("okHttpTest2") public Student test02(@RequestBody Student student, HttpServletRequest request){ String token = request.getHeader("token"); System.out.println(token); Student stu = new Student(); stu.setName(student.getName()); stu.setAge(student.getAge()); return stu; }
public static void main(String[] args) throws IOException { Response response = OkHttpUtils.builder().url("http://localhost:8080/okHttpTest2") .addHeader("token", "erwefsdf23124") .addParam("name", "zhangsan") .addParam("age", "22") .post(true) // true 为json提交方式 .sync(); String res = response.body().string(); System.out.println("请求返回结果:"+ res); System.out.println("请求头结果:"+response.headers()); System.out.println("获取某一个请求头:"+response.header("Content-Type")); }
入参传入对象形式,只能传一个对象
public static void main(String[] args) throws IOException { Student stu = new Student(); stu.setName("小明"); stu.setAge(15); Response response = OkHttpUtils.builder().url("http://localhost:8080/okHttpTest2") .addHeader("token", "erwefsdf23124") .addParam(stu) .post(true) // true 为json提交方式 .sync(); String res = response.body().string(); System.out.println("请求返回结果:"+ res); System.out.println("请求头结果:"+response.headers()); System.out.println("获取某一个请求头:"+response.header("Content-Type")); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通