package com.sprucetec.tms.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* HttpInvoker.
*
* @author Yinqiang Du
* @date 2016/8/11
*/
public class HttpInvokerUtils {
/**
* 日志.
*/
private static final Logger LOGGER = LoggerFactory.getLogger(HttpInvokerUtils.class);
/**
* 發起http get 請求獲取返回結果.
*
* @param getURL 請求路徑 .
* @return
* @throws Exception
*/
public static void readContentFromGet(String getURL) throws IOException {
// 拼湊get請求的URL字串,使用URLEncoder.encode對特殊和不可見字符進行編碼
URL getUrl = new URL(getURL);
// 根據拼湊的URL,打開連接,URL.openConnection函數會根據 URL的類型,
// 返回不同的URLConnection子類的對象,這里URL是一個http,因此實際返回的是HttpURLConnection
HttpURLConnection connection = (HttpURLConnection) getUrl
.openConnection();
// 進行連接,但是實際上get request要在下一句的 connection.getInputStream()函數中才會真正發到
// 服務器
connection.connect();
// 取得輸入流,並使用Reader讀取
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
System.out.println(" ============================= ");
System.out.println(" Contents of get request ");
System.out.println(" ============================= ");
String lines;
while ((lines = reader.readLine()) != null) {
System.out.println(lines);
}
reader.close();
// 斷開連接
connection.disconnect();
System.out.println(" ============================= ");
System.out.println(" Contents of get request ends ");
System.out.println(" ============================= ");
}
/**
* 發起http post 請求獲取返回結果.
*
* @param urlStr 請求路徑 .
* @param requestParamsJson json字符串.
* @return
* @throws Exception
*/
public static void sendRequest(String urlStr, String requestParamsJson) throws Exception {
BufferedOutputStream bufOutPut = null;
BufferedReader bufferedReader = null;
HttpURLConnection httpConn = null;
try {
URL url = new URL(urlStr);
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setDoInput(true); // 設置是否從httpUrlConnection讀入,默認情況下是true;
httpConn.setDoOutput(true); // 設置是否向httpUrlConnection輸出,因為這個是post請求,參數要放在http正文內,因此需要設為true, 默認情況下是false;
httpConn.setRequestMethod("POST");// 設定請求的方法為"POST",默認是GET
httpConn.setAllowUserInteraction(false); //是否允許用戶交互
httpConn.setUseCaches(false); // Post 請求不能使用緩存
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestProperty("Accept-Charset", "UTF-8");
httpConn.setRequestProperty("Connection", "Keep-Alive");// 維持長連接
httpConn.setRequestProperty("Content-Type", "application/json"); // 設定傳送的內容類型是可序列化的java對象
// 此處getOutputStream會隱含的進行connect(即:如同調用上面的connect()方法,
bufOutPut = new BufferedOutputStream(httpConn.getOutputStream());
httpConn.connect();
byte[] bdat = requestParamsJson.getBytes("UTF-8");// 解決中文亂碼問題
bufOutPut.write(bdat, 0, bdat.length);
bufOutPut.flush();
// 根據ResponseCode判斷連接是否成功
int responseCode = httpConn.getResponseCode();
if (responseCode != 200) {
LOGGER.error(" Error===" + responseCode);
} else {
LOGGER.info("Post Success!");
}
// 定義BufferedReader輸入流來讀取URL的ResponseData
bufferedReader = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
LOGGER.error("send post request error!" + e);
} finally {
httpConn.disconnect(); // 斷開連接
try {
if (bufOutPut != null) {
bufOutPut.close();
}
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}