| package com.doumee.core.utils; | 
|   | 
| import com.alibaba.fastjson.JSON; | 
| import com.alibaba.fastjson.JSONObject; | 
| import lombok.AllArgsConstructor; | 
| import lombok.Getter; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.springframework.http.HttpMethod; | 
|   | 
| import java.io.*; | 
| import java.net.HttpURLConnection; | 
| import java.net.URL; | 
| import java.util.Map; | 
| import java.util.zip.GZIPInputStream; | 
|   | 
| /** | 
|  * Http工具类 | 
|  * @author Eva.Caesar Liu | 
|  * @date 2023/02/14 11:14 | 
|  */ | 
| @Slf4j | 
| public class Http { | 
|   | 
|     /** | 
|      * 获取Http连接 | 
|      * @param url 请求地址 | 
|      * | 
|      * @return HttpWrap | 
|      */ | 
|     public HttpWrap build(String url) throws IOException { | 
|         return this.build(url, "UTF-8"); | 
|     } | 
|   | 
|     /** | 
|      * 获取Http连接 | 
|      * @param url 请求地址 | 
|      * @param charset 编码,默认UTF-8 | 
|      * | 
|      * @return HttpWrap | 
|      */ | 
|     public HttpWrap build(String url, String charset) throws IOException { | 
|         if (url == null) { | 
|             throw new NullPointerException("url can not be null"); | 
|         } | 
|         URL urlObj = new URL(url); | 
|         HttpURLConnection httpURLConnection = (HttpURLConnection) urlObj.openConnection(); | 
|         httpURLConnection.setRequestProperty("ContentType", charset); | 
|         return new HttpWrap(url, charset, httpURLConnection); | 
|     } | 
|   | 
|     @Getter | 
|     public static class HttpWrap { | 
|   | 
|         private String url; | 
|   | 
|         private String charset; | 
|   | 
|         private HttpURLConnection connection; | 
|   | 
|         private boolean gzip; | 
|   | 
|         public HttpWrap (String url, String charset, HttpURLConnection connection) { | 
|             this.url = url; | 
|             this.charset = charset; | 
|             this.connection = connection; | 
|         } | 
|   | 
|         /** | 
|          * 开启GZIP压缩 | 
|          */ | 
|         public HttpWrap gzip () { | 
|             this.gzip = Boolean.TRUE; | 
|             return this; | 
|         } | 
|   | 
|         /** | 
|          * 设置请求属性 | 
|          * @param key 属性 | 
|          * @param value 属性值 | 
|          * | 
|          * @return HttpWrap | 
|          */ | 
|         public HttpWrap setRequestProperty (String key, String value) { | 
|             connection.setRequestProperty(key, value); | 
|             return this; | 
|         } | 
|   | 
|         /** | 
|          * 设置连接超时时间 | 
|          * @param timeout 连接超时时间 | 
|          * | 
|          * @return HttpWrap | 
|          */ | 
|         public HttpWrap setConnectTimeout (int timeout) { | 
|             connection.setConnectTimeout(timeout); | 
|             return this; | 
|         } | 
|   | 
|         /** | 
|          * 设置读取超时时间 | 
|          * @param timeout 读取超时时间 | 
|          * | 
|          * @return HttpWrap | 
|          */ | 
|         public HttpWrap setReadTimeout (int timeout) { | 
|             connection.setReadTimeout(timeout); | 
|             return this; | 
|         } | 
|   | 
|         /** | 
|          * 发送GET请求 | 
|          * | 
|          * @return HttpResult | 
|          */ | 
|         public HttpResult get () throws IOException { | 
|             log.trace("Eva::Util::Http send http request by method GET, url=" + url); | 
|             connection.setRequestMethod(HttpMethod.GET.toString()); | 
|             return new HttpResult(connection.getInputStream(), charset, gzip); | 
|         } | 
|   | 
|         /** | 
|          * 发送POST请求 | 
|          * | 
|          * @return HttpResult | 
|          */ | 
|         public HttpResult post () throws IOException { | 
|             log.trace("Eva::Util::Http send http request by method POST, url=" + url); | 
|             connection.setRequestMethod(HttpMethod.POST.toString()); | 
|             return new HttpResult(connection.getInputStream(), charset, gzip); | 
|         } | 
|   | 
|         /** | 
|          * 发送POST请求 | 
|          * @param params 请求参数 | 
|          * | 
|          * @return HttpResult | 
|          */ | 
|         public HttpResult post (String params) throws IOException { | 
|             log.trace("Eva::Util::Http send http request by method POST, url=" + url); | 
|             OutputStreamWriter streamWriter = null; | 
|             try { | 
|                 connection.setRequestMethod(HttpMethod.POST.toString()); | 
|                 if (params != null || "".equals(params.trim())) { | 
|                     connection.setDoInput(Boolean.TRUE); | 
|                     connection.setDoOutput(Boolean.TRUE); | 
|                     streamWriter = new OutputStreamWriter(connection.getOutputStream(), charset); | 
|                     streamWriter.write(params); | 
|                     streamWriter.flush(); | 
|                 } | 
|                 return new HttpResult(connection.getInputStream(), charset, gzip); | 
|             } finally { | 
|                 if (streamWriter != null) { | 
|                     streamWriter.close(); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         /** | 
|          * 发送POST请求,请求参数类型为JSON | 
|          * @param paramsMap 请求参数 | 
|          * | 
|          * @return HttpResult | 
|          */ | 
|         public HttpResult postJSON(Map<String, Object> paramsMap) throws IOException { | 
|             setRequestProperty("Content-Type", "application/json"); | 
|             if (paramsMap == null || paramsMap.size() == 0) { | 
|                 return post(); | 
|             } | 
|             return post(JSON.toJSONString(paramsMap)); | 
|         } | 
|   | 
|         /** | 
|          * 发送POST请求,请求参数类型为JSON | 
|          * @param paramJSONObject 请求参数 | 
|          * | 
|          * @return HttpResult | 
|          */ | 
|         public HttpResult postJSON(JSONObject paramJSONObject) throws IOException { | 
|             setRequestProperty("Content-Type", "application/json"); | 
|             if (paramJSONObject == null || paramJSONObject.size() == 0) { | 
|                 return post(); | 
|             } | 
|             return post(paramJSONObject.toJSONString()); | 
|         } | 
|   | 
|     } | 
|   | 
|     @Getter | 
|     @AllArgsConstructor | 
|     public static class HttpResult { | 
|   | 
|         private InputStream inputStream; | 
|   | 
|         private String charset; | 
|   | 
|         private boolean gzip; | 
|   | 
|         /** | 
|          * 转为字符串 | 
|          */ | 
|         public String toStringResult () throws IOException{ | 
|             BufferedReader reader = null; | 
|             InputStream is = inputStream; | 
|             try { | 
|                 if (gzip) { | 
|                     is = new GZIPInputStream(inputStream); | 
|                 } | 
|                 reader = new BufferedReader(new InputStreamReader(is, charset)); | 
|                 StringBuilder result = new StringBuilder(); | 
|                 String line; | 
|                 while((line = reader.readLine()) != null) { | 
|                     result.append(line); | 
|                 } | 
|                 return result.toString(); | 
|             } finally { | 
|                 if (reader != null) { | 
|                     reader.close(); | 
|                 } | 
|                 if (is != null) { | 
|                     is.close(); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         /** | 
|          * 转为JSONObject对象 | 
|          */ | 
|         public JSONObject toJSONObject () throws IOException { | 
|             return JSONObject.parseObject(toStringResult()); | 
|         } | 
|   | 
|         /** | 
|          * 转为目标Class对象 | 
|          */ | 
|         public <T> T toClass (Class<T> clazz) throws IOException { | 
|             return JSONObject.parseObject(toStringResult(), clazz); | 
|         } | 
|     } | 
| } |