|
@@ -0,0 +1,403 @@
|
|
|
+package com.malk.boyang.utils;
|
|
|
+
|
|
|
+import java.io.BufferedReader;
|
|
|
+import java.io.DataOutputStream;
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileInputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStreamReader;
|
|
|
+import java.io.OutputStream;
|
|
|
+import java.io.OutputStreamWriter;
|
|
|
+import java.io.PrintWriter;
|
|
|
+import java.io.UnsupportedEncodingException;
|
|
|
+import java.net.HttpURLConnection;
|
|
|
+import java.net.MalformedURLException;
|
|
|
+import java.net.URL;
|
|
|
+import java.net.URLConnection;
|
|
|
+import java.net.UnknownHostException;
|
|
|
+import java.text.MessageFormat;
|
|
|
+import java.util.LinkedHashMap;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Map.Entry;
|
|
|
+import java.util.Set;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+
|
|
|
+public class HTTPHelper {
|
|
|
+ // slf4j日志记录器
|
|
|
+ private static final Logger LOG = LoggerFactory.getLogger(HTTPHelper.class);
|
|
|
+ // 结尾符
|
|
|
+ private static final String LINE_FEED = "\r\n";
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 向指定URL发送GET方法的请求
|
|
|
+ *
|
|
|
+ * @param apiUrl
|
|
|
+ * @param data
|
|
|
+ * @param projectId
|
|
|
+ * @param signature
|
|
|
+ * @param encoding
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public static String sendGet(String apiUrl, LinkedHashMap<String, String> headers,
|
|
|
+ String encoding) throws Exception {
|
|
|
+ // 获得响应内容
|
|
|
+ String http_RespContent = null;
|
|
|
+ HttpURLConnection httpURLConnection = null;
|
|
|
+ int http_StatusCode = 0;
|
|
|
+ String http_RespMessage = null;
|
|
|
+ try {
|
|
|
+ LOG.info(">>>> 实际请求Url: " + apiUrl);
|
|
|
+
|
|
|
+ // 建立连接
|
|
|
+ URL url = new URL(apiUrl);
|
|
|
+ httpURLConnection = (HttpURLConnection) url.openConnection();
|
|
|
+ // 需要输出
|
|
|
+ httpURLConnection.setDoOutput(true);
|
|
|
+ // 需要输入
|
|
|
+ httpURLConnection.setDoInput(true);
|
|
|
+ // 不允许缓存
|
|
|
+ httpURLConnection.setUseCaches(false);
|
|
|
+ // HTTP请求方式
|
|
|
+ httpURLConnection.setRequestMethod("GET");
|
|
|
+ // 设置Headers
|
|
|
+ if (null != headers) {
|
|
|
+ for (String key : headers.keySet()) {
|
|
|
+ httpURLConnection.setRequestProperty(key, headers.get(key));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 连接会话
|
|
|
+ httpURLConnection.connect();
|
|
|
+ // 获得响应状态(HTTP状态码)
|
|
|
+ http_StatusCode = httpURLConnection.getResponseCode();
|
|
|
+ // 获得响应消息(HTTP状态码描述)
|
|
|
+ http_RespMessage = httpURLConnection.getResponseMessage();
|
|
|
+ // 获得响应内容
|
|
|
+ if (HttpURLConnection.HTTP_OK == http_StatusCode) {
|
|
|
+ // 返回响应结果
|
|
|
+ http_RespContent = getResponseContent(httpURLConnection);
|
|
|
+ } else {
|
|
|
+ // 返回非200状态时响应结果
|
|
|
+ http_RespContent = getErrorResponseContent(httpURLConnection);
|
|
|
+ String msg =
|
|
|
+ MessageFormat.format("请求失败: Http状态码 = {0} , {1}", http_StatusCode, http_RespMessage);
|
|
|
+ LOG.info(msg);
|
|
|
+ }
|
|
|
+ } catch (UnknownHostException e) {
|
|
|
+ String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } catch (MalformedURLException e) {
|
|
|
+ String message = MessageFormat.format("格式错误的URL: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } catch (IOException e) {
|
|
|
+ String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } catch (Exception e) {
|
|
|
+ String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } finally {
|
|
|
+ if (null != httpURLConnection) {
|
|
|
+ httpURLConnection.disconnect();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return http_RespContent;
|
|
|
+ }
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 向指定URL发送POST方法的请求
|
|
|
+ *
|
|
|
+ * @param apiUrl
|
|
|
+ * @param data
|
|
|
+ * @param encoding
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public static String sendPOST(String apiUrl, String data, LinkedHashMap<String, String> headers,
|
|
|
+ String encoding) throws Exception {
|
|
|
+ // 获得响应内容
|
|
|
+ String http_RespContent = null;
|
|
|
+ HttpURLConnection httpURLConnection = null;
|
|
|
+ int http_StatusCode = 0;
|
|
|
+ String http_RespMessage = null;
|
|
|
+ try {
|
|
|
+ // 建立连接
|
|
|
+ URL url = new URL(apiUrl);
|
|
|
+ httpURLConnection = (HttpURLConnection) url.openConnection();
|
|
|
+ // 需要输出
|
|
|
+ httpURLConnection.setDoOutput(true);
|
|
|
+ // 需要输入
|
|
|
+ httpURLConnection.setDoInput(true);
|
|
|
+ // 不允许缓存
|
|
|
+ httpURLConnection.setUseCaches(false);
|
|
|
+ // HTTP请求方式
|
|
|
+ httpURLConnection.setRequestMethod("POST");
|
|
|
+ // 设置Headers
|
|
|
+ if (null != headers) {
|
|
|
+ for (String key : headers.keySet()) {
|
|
|
+ httpURLConnection.setRequestProperty(key, headers.get(key));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 连接会话
|
|
|
+ httpURLConnection.connect();
|
|
|
+ // 建立输入流,向指向的URL传入参数
|
|
|
+ DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
|
|
|
+ // 设置请求参数
|
|
|
+ dos.write(data.getBytes(encoding));
|
|
|
+ dos.flush();
|
|
|
+ dos.close();
|
|
|
+ // 获得响应状态(HTTP状态码)
|
|
|
+ http_StatusCode = httpURLConnection.getResponseCode();
|
|
|
+ // 获得响应消息(HTTP状态码描述)
|
|
|
+ http_RespMessage = httpURLConnection.getResponseMessage();
|
|
|
+ // 获得响应内容
|
|
|
+ if (HttpURLConnection.HTTP_OK == http_StatusCode) {
|
|
|
+ // 返回响应结果
|
|
|
+ http_RespContent = getResponseContent(httpURLConnection);
|
|
|
+ } else {
|
|
|
+ // 返回非200状态时响应结果
|
|
|
+ http_RespContent = getErrorResponseContent(httpURLConnection);
|
|
|
+ String msg =
|
|
|
+ MessageFormat.format("请求失败: Http状态码 = {0} , {1}", http_StatusCode, http_RespMessage);
|
|
|
+ LOG.info(msg);
|
|
|
+ }
|
|
|
+ } catch (UnknownHostException e) {
|
|
|
+ String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } catch (MalformedURLException e) {
|
|
|
+ String message = MessageFormat.format("格式错误的URL: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } catch (IOException e) {
|
|
|
+ String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } catch (Exception e) {
|
|
|
+ String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } finally {
|
|
|
+ if (null != httpURLConnection) {
|
|
|
+ httpURLConnection.disconnect();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return http_RespContent;
|
|
|
+ }
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 读取HttpResponse响应内容
|
|
|
+ *
|
|
|
+ * @param httpURLConnection
|
|
|
+ * @return
|
|
|
+ * @throws UnsupportedEncodingException
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ private static String getResponseContent(HttpURLConnection httpURLConnection)
|
|
|
+ throws UnsupportedEncodingException, IOException {
|
|
|
+ StringBuffer contentBuffer = null;
|
|
|
+ BufferedReader responseReader = null;
|
|
|
+ try {
|
|
|
+ contentBuffer = new StringBuffer();
|
|
|
+ String readLine = null;
|
|
|
+ responseReader =
|
|
|
+ new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
|
|
|
+ while ((readLine = responseReader.readLine()) != null) {
|
|
|
+ contentBuffer.append(readLine);
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ if (null != responseReader) {
|
|
|
+ responseReader.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return contentBuffer.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 读取HttpResponse响应内容
|
|
|
+ *
|
|
|
+ * @param httpURLConnection
|
|
|
+ * @return
|
|
|
+ * @throws UnsupportedEncodingException
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ private static String getErrorResponseContent(HttpURLConnection httpURLConnection)
|
|
|
+ throws UnsupportedEncodingException, IOException {
|
|
|
+ StringBuffer contentBuffer = null;
|
|
|
+ BufferedReader responseReader = null;
|
|
|
+ try {
|
|
|
+ contentBuffer = new StringBuffer();
|
|
|
+ String readLine = null;
|
|
|
+ responseReader =
|
|
|
+ new BufferedReader(new InputStreamReader(httpURLConnection.getErrorStream(), "UTF-8"));
|
|
|
+ while ((readLine = responseReader.readLine()) != null) {
|
|
|
+ contentBuffer.append(readLine);
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ if (null != responseReader) {
|
|
|
+ responseReader.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return contentBuffer.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 上传文件
|
|
|
+ *
|
|
|
+ * @param apiUrl 请求url
|
|
|
+ * @param fileFieldName 文件在请求体中的field名字
|
|
|
+ * @param filePath 文件路径
|
|
|
+ * @param data 请求体
|
|
|
+ * @param headers headers
|
|
|
+ * @param encoding 编码格式
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public static String uploadFile(String apiUrl, String fileFieldName, String filePath, Map<String, Object> data,
|
|
|
+ LinkedHashMap<String, String> headers, String encoding) throws Exception {
|
|
|
+ // 获得响应内容
|
|
|
+ String http_RespContent;
|
|
|
+ HttpURLConnection httpURLConnection = null;
|
|
|
+ int http_StatusCode = 0;
|
|
|
+ String http_RespMessage;
|
|
|
+ try {
|
|
|
+ String boundary = "---" + System.currentTimeMillis() + "---";
|
|
|
+ httpURLConnection = (HttpURLConnection) new URL(apiUrl).openConnection();
|
|
|
+ // 设置为POST情
|
|
|
+ httpURLConnection.setRequestMethod("POST");
|
|
|
+ // 发送POST请求必须设置如下两行
|
|
|
+ httpURLConnection.setDoOutput(true);
|
|
|
+ httpURLConnection.setDoInput(true);
|
|
|
+ httpURLConnection.setUseCaches(false);
|
|
|
+ // 设置请求头参数
|
|
|
+ // 设置Headers
|
|
|
+ if (null != headers) {
|
|
|
+ for (String key : headers.keySet()) {
|
|
|
+ httpURLConnection.setRequestProperty(key, headers.get(key));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
|
|
|
+
|
|
|
+ OutputStream outputStream = httpURLConnection.getOutputStream();
|
|
|
+ PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, encoding),
|
|
|
+ true);
|
|
|
+ if (data != null && data.size() != 0) {
|
|
|
+ Set<Entry<String, Object>> entries = data.entrySet();
|
|
|
+ for (Entry<String, Object> entry : entries) {
|
|
|
+ if (entry.getValue() != null) {
|
|
|
+ addFormField(writer, boundary, "UTF-8", entry.getKey(), entry.getValue().toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ addFilePart(writer, outputStream, boundary, fileFieldName, new File(filePath));
|
|
|
+ writer.println("--" + boundary + "--");
|
|
|
+ writer.close();
|
|
|
+ // 获得响应状态(HTTP状态码)
|
|
|
+ http_StatusCode = httpURLConnection.getResponseCode();
|
|
|
+ // 获得响应消息(HTTP状态码描述)
|
|
|
+ http_RespMessage = httpURLConnection.getResponseMessage();
|
|
|
+ // 获得响应内容
|
|
|
+ if (HttpURLConnection.HTTP_OK == http_StatusCode) {
|
|
|
+ // 返回响应结果
|
|
|
+ http_RespContent = getResponseContent(httpURLConnection);
|
|
|
+ } else {
|
|
|
+ // 返回非200状态时响应结果
|
|
|
+ http_RespContent = getErrorResponseContent(httpURLConnection);
|
|
|
+ String msg =
|
|
|
+ MessageFormat.format("请求失败: Http状态码 = {0} , {1}", http_StatusCode, http_RespMessage);
|
|
|
+ LOG.info(msg);
|
|
|
+ }
|
|
|
+ } catch (UnknownHostException e) {
|
|
|
+ String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } catch (MalformedURLException e) {
|
|
|
+ String message = MessageFormat.format("格式错误的URL: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } catch (IOException e) {
|
|
|
+ String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } catch (Exception e) {
|
|
|
+ String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
|
|
|
+ Exception ex = new Exception(message);
|
|
|
+ ex.initCause(e);
|
|
|
+ throw ex;
|
|
|
+ } finally {
|
|
|
+ if (null != httpURLConnection) {
|
|
|
+ httpURLConnection.disconnect();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return http_RespContent;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加请求体的key和value
|
|
|
+ *
|
|
|
+ * @param name field name
|
|
|
+ * @param value field value
|
|
|
+ */
|
|
|
+ public static void addFormField(PrintWriter writer, String boundary, String charset, String name, String value) {
|
|
|
+ writer.append("--" + boundary).append(LINE_FEED);
|
|
|
+ writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
|
|
|
+ .append(LINE_FEED);
|
|
|
+ writer.append("Content-Type: text/plain; charset=" + charset).append(
|
|
|
+ LINE_FEED);
|
|
|
+ writer.append(LINE_FEED);
|
|
|
+ writer.append(value).append(LINE_FEED);
|
|
|
+ writer.flush();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加文件到请求中
|
|
|
+ *
|
|
|
+ * @param fieldName field名字
|
|
|
+ * @param uploadFile 要上传的文件
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ public static void addFilePart(PrintWriter writer, OutputStream outputStream, String boundary,
|
|
|
+ String fieldName, File uploadFile)
|
|
|
+ throws IOException {
|
|
|
+ String fileName = uploadFile.getName();
|
|
|
+ writer.append("--" + boundary).append(LINE_FEED);
|
|
|
+ writer.append(
|
|
|
+ "Content-Disposition: form-data; name=\"" + fieldName
|
|
|
+ + "\"; filename=\"" + fileName + "\"")
|
|
|
+ .append(LINE_FEED);
|
|
|
+ writer.append(
|
|
|
+ "Content-Type: "
|
|
|
+ + URLConnection.guessContentTypeFromName(fileName))
|
|
|
+ .append(LINE_FEED);
|
|
|
+ writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
|
|
|
+ writer.append(LINE_FEED);
|
|
|
+ writer.flush();
|
|
|
+
|
|
|
+ FileInputStream inputStream = new FileInputStream(uploadFile);
|
|
|
+ byte[] buffer = new byte[4096];
|
|
|
+ int bytesRead = -1;
|
|
|
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
|
|
|
+ outputStream.write(buffer, 0, bytesRead);
|
|
|
+ }
|
|
|
+ outputStream.flush();
|
|
|
+ inputStream.close();
|
|
|
+ writer.append(LINE_FEED);
|
|
|
+ writer.flush();
|
|
|
+ }
|
|
|
+}
|