Java使用okhttp发送get、post请求
一、添加依赖
‘
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.4.1</version>
</dependency>二、封装请求工具类
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;@Slf4j
@SuppressWarnings("all")
public class OkHttpUtils {/*** 发送get请求** @param url* @param params* @param tClass* @return <T>*/public static <T> T getRequest(String url, Map<String, Object> params, Class<T> tClass) {return getRequest(url, null, params, tClass);}/*** 发送get请求** @param url* @param params* @param tClass* @return <T>*/public static <T> T getRequest(String url, Map<String, Object> headers, Map<String, Object> params, Class<T> tClass) {// 超时时间为60sOkHttpClient client = new OkHttpClient.Builder().connectTimeout(3, TimeUnit.MINUTES).readTimeout(3, TimeUnit.MINUTES).writeTimeout(3, TimeUnit.MINUTES)// 设置空闲连接数为0个,每个空闲连接的存活时间为1纳秒.connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS)).protocols(Arrays.asList(Protocol.HTTP_1_1)).build();HttpUrl.Builder httpBuilder = HttpUrl.parse(url).newBuilder();if (params != null) {params.forEach((k, v) -> {if (v != null) {httpBuilder.addQueryParameter(k, String.valueOf(v));}});}Request.Builder requestBuilder = new Request.Builder();if (headers != null) {headers.forEach((k, v) -> requestBuilder.addHeader(k, String.valueOf(v)));}Request request = requestBuilder.url(httpBuilder.build()).get().addHeader("Content-Type", "application/x-www-form-urlencoded").build();try {Response response = client.newCall(request).execute();String string = response.body().string();log.info("响应结果:" + string);if (response.code() == 504) {throw new IOException("请求超时,请您稍后重试!");}return JSON.parseObject(string, tClass);} catch (IOException e) {log.error(e.getMessage(), e);if (e.getMessage().contains("timeout"))throw new RuntimeException("请求超时,请您稍后重试!");else throw new RuntimeException(e.getMessage());} catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException("系统错误,请您联系客服!");}}/*** 发送post请求,参数为json格式** @param url* @param jsonStr* @param tClass* @return <T>*/public static <T> T postRequest(String url, String jsonStr, Class<T> tClass) {return postRequest(url, null, jsonStr, tClass);}/*** 发送post请求,参数为json格式** @param url* @param headers* @param jsonStr* @param tClass* @return <T>*/public static <T> T postRequest(String url, Map<String, Object> headers, String jsonStr, Class<T> tClass) {OkHttpClient client = new OkHttpClient.Builder().connectTimeout(3, TimeUnit.MINUTES).readTimeout(3, TimeUnit.MINUTES).writeTimeout(3, TimeUnit.MINUTES)// 设置空闲连接数为0个,每个空闲连接的存活时间为1纳秒.connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS)).protocols(Arrays.asList(Protocol.HTTP_1_1)).build();MediaType type = MediaType.parse("application/json;charset=utf-8");if (jsonStr == null || "".equals(jsonStr)) {jsonStr = "{}";}RequestBody requestBody = RequestBody.create(type, jsonStr);Request.Builder requestBuilder = new Request.Builder();if (headers != null) {headers.forEach((k, v) -> requestBuilder.addHeader(k, String.valueOf(v)));}Request request = requestBuilder.url(url).post(requestBody).addHeader("Content-Type", "application/json;charset=utf-8").build();try {Response response = client.newCall(request).execute();String string = response.body().string();log.info("响应结果:" + string);if (response.code() == 504) {throw new IOException("请求超时,请您稍后重试!");}return JSON.parseObject(string, tClass);} catch (IOException e) {log.error(e.getMessage(), e);if (e.getMessage().contains("timeout"))throw new RuntimeException("请求超时,请您稍后重试!");else throw new RuntimeException(e.getMessage());} catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException("系统错误,请您联系客服!");}}/*** 发送post请求,参数为json格式** @param url* @param params* @param tClass* @return <T>*/public static <T> T postRequest(String url, Map<String, Object> params, Class<T> tClass) {return postRequest(url, null, params, tClass);}/*** 发送post请求,参数为json格式** @param url* @param headers* @param params* @param tClass* @return <T>*/public static <T> T postRequest(String url, Map<String, Object> headers, Map<String, Object> params, Class<T> tClass) {OkHttpClient client = new OkHttpClient.Builder().connectTimeout(3, TimeUnit.MINUTES).readTimeout(3, TimeUnit.MINUTES).writeTimeout(3, TimeUnit.MINUTES)// 设置空闲连接数为0个,每个空闲连接的存活时间为1纳秒.connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS)).protocols(Arrays.asList(Protocol.HTTP_1_1)).build();MediaType type = MediaType.parse("application/json;charset=utf-8");String jsonStr = "{}";if (params != null && !params.isEmpty()) {jsonStr = JSON.toJSONString(params);}RequestBody requestBody = RequestBody.create(type, jsonStr);Request.Builder requestBuilder = new Request.Builder();if (headers != null) {headers.forEach((k, v) -> requestBuilder.addHeader(k, String.valueOf(v)));}Request request = requestBuilder.url(url).post(requestBody).addHeader("Content-Type", "application/json;charset=utf-8").build();try {Response response = client.newCall(request).execute();String string = response.body().string();log.info("响应结果:" + string);if (response.code() == 504) {throw new IOException("请求超时,请您稍后重试!");}return JSON.parseObject(string, tClass);} catch (IOException e) {log.error(e.getMessage(), e);if (e.getMessage().contains("timeout"))throw new RuntimeException("请求超时,请您稍后重试!");else throw new RuntimeException(e.getMessage());} catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException("系统错误,请您联系客服!");}}/*** 发送post请求,参数为form格式** @param url* @param params* @param tClass* @return <T>*/public static <T> T postFormRequest(String url, Map<String, Object> params, Class<T> tClass) {return postFormRequest(url, null, params, tClass);}/*** 发送post请求,参数为form格式** @param url* @param headers* @param params* @param tClass* @return <T>*/public static <T> T postFormRequest(String url, Map<String, Object> headers, Map<String, Object> params, Class<T> tClass) {OkHttpClient client = new OkHttpClient.Builder().connectTimeout(3, TimeUnit.MINUTES).readTimeout(3, TimeUnit.MINUTES).writeTimeout(3, TimeUnit.MINUTES)// 设置空闲连接数为0个,每个空闲连接的存活时间为1纳秒.connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS)).protocols(Arrays.asList(Protocol.HTTP_1_1)).build();// 创建表单体FormBody.Builder formBodyBuilder = new FormBody.Builder();// 添加表单数据if (params != null) {params.forEach((k, v) -> {if (v != null) {String newVal = "";if (v instanceof String) {newVal = (String) v;} else {newVal = JSON.toJSONString(v);}formBodyBuilder.add(k, newVal);}});}FormBody formBody = formBodyBuilder.build();Request.Builder requestBuilder = new Request.Builder();if (headers != null) {headers.forEach((k, v) -> requestBuilder.addHeader(k, String.valueOf(v)));}Request request = requestBuilder.url(url).post(formBody).build();try {Response response = client.newCall(request).execute();String string = response.body().string();log.info("响应结果:" + string);if (response.code() == 504) {throw new IOException("请求超时,请您稍后重试!");}return JSON.parseObject(string, tClass);} catch (IOException e) {log.error(e.getMessage(), e);if (e.getMessage().contains("timeout"))throw new RuntimeException("请求超时,请您稍后重试!");else throw new RuntimeException(e.getMessage());} catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException("系统错误,请您联系客服!");}}}