1 public class HttpClientUtils {
2
3 private static final String UTF_8 = "UTF-8";
4
5 private HttpClientUtils() {
6 }
7
8 public static boolean isHttps(String url) {
9 return "https".equalsIgnoreCase(url.substring(0, 5));
10 }
11
12 public static String doPost(String url, String params) throws Exception {
13 return doPost(url, params, UTF_8);
14 }
15
16 public static String doPostHttps(String url, String params) throws Exception {
17 return doPostHttps(url, params, UTF_8);
18 }
19
20 public static String doPost(String url, String params, String charset) throws Exception {
21 String contentType = "application/json;charset=" + charset;
22 return doPost(url, params.getBytes(charset), contentType);
23 }
24
25 public static String doPostHttps(String url, String params, String charset) throws Exception {
26 String contentType = "application/json;charset=" + charset;
27 return doPostHttps(url, contentType, params.getBytes(charset));
28 }
29
30
31 public static String doPost(String url, byte[] content, String contentType) throws Exception {
32 HttpURLConnection conn = null;
33 OutputStream out = null;
34 String rsp = null;
35 try {
36 conn = getConnection(new URL(url), "POST", contentType);
37 out = conn.getOutputStream();
38 out.write(content);
39 rsp = getResponseAsString(conn);
40 } finally {
41 if (out != null) {
42 out.close();
43 }
44 if (conn != null) {
45 conn.disconnect();
46 }
47 }
48 return rsp;
49 }
50
51
52 public static String doGet(String url, Map params) throws Exception {
53 return doGet(url, params, UTF_8);
54 }
55
56 public static String doGet(String url, Map params, String charset) throws Exception {
57 HttpURLConnection conn = null;
58 String rsp;
59 try {
60 String contentType = "application/x-www-form-urlencoded;charset=" + charset;
61 String query = buildQuery(params, charset);
62 conn = getConnection(buildGetUrl(url, query), "GET", contentType);
63 rsp = getResponseAsString(conn);
64 } finally {
65 if (conn != null) {
66 conn.disconnect();
67 }
68 }
69
70 return rsp;
71 }
72
73 public static String doGetHttps(String url, String charset) throws Exception {
74 HttpsURLConnection conn = null;
75 String rsp = null;
76 try {
77 String contentType = "application/x-www-form-urlencoded;charset=" + charset;
78 conn = getConnectionHttps(new URL(url), "GET", contentType);
79 rsp = getResponseAsString(conn);
80 } finally {
81 if (conn != null) {
82 conn.disconnect();
83 }
84
85 }
86
87 return rsp;
88 }
89
90 public static String doPostHttps(String url, String contentType, byte[] content) throws Exception {
91 HttpsURLConnection conn = null;
92 OutputStream out = null;
93 String rsp = null;
94 try {
95 conn = getConnectionHttps(new URL(url), "POST", contentType);
96 out = conn.getOutputStream();
97 out.write(content);
98 rsp = getResponseAsString(conn);
99 } finally {
100 if (out != null) {
101 out.close();
102 }
103
104 if (conn != null) {
105 conn.disconnect();
106 }
107
108 }
109
110 return rsp;
111 }
112
113
114 private static HttpURLConnection getConnection(URL url, String method, String contentType) throws Exception {
115
116 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
117 conn.setDoInput(true);
118 conn.setDoOutput(true);
119 conn.setRequestMethod(method);
120 conn.setRequestProperty("Content-Type", contentType);
121 conn.setRequestProperty("Connection", "Keep-Alive");
122 conn.setConnectTimeout(5000);
123 conn.setReadTimeout(15000);
124 return conn;
125 }
126
127 private static HttpsURLConnection getConnectionHttps(URL url, String method, String contentType) throws Exception {
128 SSLContext sslContext = null;
129
130 try {
131 sslContext = SSLContext.getInstance("TLSv1.2");
132 X509TrustManager[] xtmArray = new X509TrustManager[]{new GYX509TrustManager()};
133 sslContext.init(null, xtmArray, new SecureRandom());
134 } catch (GeneralSecurityException ignore) {
135 }
136
137 if (sslContext != null) {
138 HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
139 }
140
141 HttpsURLConnection.setDefaultHostnameVerifier(new GYHostnameVerifier());
142 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
143 conn.setDoInput(true);
144 conn.setDoOutput(true);
145 conn.setRequestMethod(method);
146 conn.setRequestProperty("Content-Type", contentType);
147 conn.setRequestProperty("Connection", "Keep-Alive");
148 conn.setConnectTimeout(5000);
149 return conn;
150 }
151
152 private static URL buildGetUrl(String strUrl, String query) throws Exception {
153 URL url = new URL(strUrl);
154 if (StringUtils.isEmpty(query)) {
155 return url;
156 } else {
157 if (StringUtils.isEmpty(url.getQuery())) {
158 if (strUrl.endsWith("?")) {
159 strUrl = strUrl + query;
160 } else {
161 strUrl = strUrl + "?" + query;
162 }
163 } else if (strUrl.endsWith("&")) {
164 strUrl = strUrl + query;
165 } else {
166 strUrl = strUrl + "&" + query;
167 }
168
169 return new URL(strUrl);
170 }
171 }
172
173
174 public static String buildQuery(Map params, String charset) throws Exception {
175 if (params != null && !params.isEmpty()) {
176 StringBuilder query = new StringBuilder();
177 Set> entries = params.entrySet();
178 boolean hasParam = false;
179 Iterator> querpParams = entries.iterator();
180 while (querpParams.hasNext()) {
181 Entry entry = querpParams.next();
182 String name = entry.getKey();
183 String value = entry.getValue();
184 if (StringUtils.isNotBlank(name) && StringUtils.isNotBlank(value)) {
185 if (hasParam) {
186 query.append("&");
187 } else {
188 hasParam = true;
189 }
190 query.append(name).append("=").append(URLEncoder.encode(value, charset));
191 }
192 }
193 return query.toString();
194 } else {
195 return null;
196 }
197 }
198
199 private static String getResponseAsString(HttpURLConnection conn) throws Exception {
200 String charset = getResponseCharset(conn.getContentType());
201 InputStream es = conn.getErrorStream();
202 if (conn.getResponseCode() != 200) throw new Exception("请求异常: " + conn.getResponseMessage());
203 if (es == null) {
204 return getStreamAsString(conn.getInputStream(), charset);
205 } else {
206 String msg = getStreamAsString(es, charset);
207 if (StringUtils.isEmpty(msg)) {
208 throw new Exception(conn.getResponseCode() + ":" + conn.getResponseMessage());
209 } else {
210 return msg;
211 }
212 }
213 }
214
215 private static String getStreamAsString(InputStream stream, String charset) throws Exception {
216 try (
217 BufferedReader reader = new BufferedReader(new InputStreamReader(stream, charset));
218 StringWriter writer = new StringWriter();
219 ) {
220
221 char[] chars = new char[256];
222 int count;
223 while ((count = reader.read(chars)) > 0) {
224 writer.write(chars, 0, count);
225 }
226 return writer.toString();
227 } finally {
228 if (stream != null) {
229 stream.close();
230 }
231 }
232 }
233
234 private static String getResponseCharset(String contentType) {
235 String charset = UTF_8;
236 if (!StringUtils.isEmpty(contentType)) {
237 String[] params = contentType.split(";");
238 for (int i = 0; i < params.length; ++i) {
239 String param = params[i];
240 param = param.trim();
241 if (param.startsWith("charset")) {
242 String[] pair = param.split("=", 2);
243 if (pair.length == 2 && !StringUtils.isEmpty(pair[1])) {
244 charset = pair[1].trim();
245 }
246 break;
247 }
248 }
249 }
250 return charset;
251 }
252
253 public static String decode(String value) {
254 return decode(value, UTF_8);
255 }
256
257 public static String decode(String value, String charset) {
258 String result = null;
259 if (!StringUtils.isEmpty(value)) {
260 try {
261 result = URLDecoder.decode(value, charset);
262 } catch (Exception var4) {
263 throw new RuntimeException(var4);
264 }
265 }
266
267 return result;
268 }
269
270 public static String encode(String value) {
271 return encode(value, UTF_8);
272 }
273
274 public static String encode(String value, String charset) {
275 String result = null;
276 if (!StringUtils.isEmpty(value)) {
277 try {
278 result = URLEncoder.encode(value, charset);
279 } catch (Exception var4) {
280 throw new RuntimeException(var4);
281 }
282 }
283
284 return result;
285 }
286
287 public static Map splitUrlQuery(String query) {
288 Map result = new HashMap<>();
289 String[] pairs = query.split("&");
290 if (pairs.length > 0) {
291 String[] var3 = pairs;
292 int var4 = pairs.length;
293 for (int var5 = 0; var5 < var4; ++var5) {
294 String pair = var3[var5];
295 String[] param = pair.split("=", 2);
296 if (param.length == 2) {
297 result.put(param[0], param[1]);
298 }
299 }
300 }
301
302 return result;
303 }
304
305
306 static class GYX509TrustManager implements X509TrustManager {
307 GYX509TrustManager() {
308 }
309
310 public void checkClientTrusted(X509Certificate[] chain, String authType) {
311 // do nothing
312 }
313
314 public void checkServerTrusted(X509Certificate[] chain, String authType) {
315 // do nothing
316 }
317
318 public X509Certificate[] getAcceptedIssuers() {
319 return null;
320 }
321 }
322
323 static class GYHostnameVerifier implements HostnameVerifier {
324 GYHostnameVerifier() {
325 }
326
327 public boolean verify(String hostname, SSLSession session) {
328 return false;
329 }
330 }
331 }