最近學習了一下http的get請求和post請求的寫法,整理如下,並封裝了工具類,如有錯誤和不足之處歡迎各位批評糾正,互相學習!
package mj.http.utils;
/**
* Created by MJ on 15/9/25.
*
* @use 該HttpParam類用於封裝HTTP請求參數
*/
public class HttpParam {
private String key; // 請求參數
private String value; // 參數值
public HttpParam() {}
public HttpParam(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package mj.http.utils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
/**
* Created by MJ on 15/9/25.
*/
public class HttpParamOperation {
private HttpParamOperation() {}
private static Logger logger = Logger.getLogger(HttpParamOperation.class.getName());
/**
* Created by MJ on 15/9/25.
*
* @use 將map轉換成url參數格式: name1=value1&name2=value2
*
* @param map 參數map
* @return String 返回參數格式: name1=value1&name2=value2
*/
public static String getUrlParamsFromMap(Map<String, String> map) throws Exception {
try {
if (null != map) {
StringBuilder stringBuilder = new StringBuilder();
for (Map.Entry<String, String> entry : map.entrySet()) {
stringBuilder.append(URLEncoder.encode(entry.getKey(), "UTF-8")).append("=")
.append(URLEncoder.encode(entry.getValue(), "UTF-8")).append("&");
}
String content = stringBuilder.toString();
if (content.endsWith("&")) {
content = StringUtils.substringBeforeLast(content, "&");
}
return content;
}
} catch (Exception e) {
logger.error(e);
}
return null;
}
/**
* Created by MJ on 15/9/25.
*
* @use 將HttpParam列表轉換成url參數格式: name1=value1&name2=value2
*
* @param httpParamList HttpParam列表
* @return String 返回參數格式: name1=value1&name2=value2
*/
public static String getUrlParamsFromList(List<HttpParam> httpParamList) throws Exception {
try {
if (null != httpParamList) {
StringBuilder stringBuilder = new StringBuilder();
if (httpParamList.size() > 0) {
for (HttpParam httpParam : httpParamList) {
stringBuilder.append(URLEncoder.encode(httpParam.getKey(), "UTF-8")).append("=")
.append(URLEncoder.encode(httpParam.getValue(), "UTF-8")).append("&");
}
String content = stringBuilder.toString();
if (content.endsWith("&")) {
content = StringUtils.substringBeforeLast(content, "&");
}
return content;
}
}
} catch (Exception e) {
logger.error(e);
}
return null;
}
}
package mj.http.utils;
import org.apache.log4j.Logger;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* Created by MJ on 15/9/25.
*/
public class HttpRequestUtils {
private HttpRequestUtils() {}
private static Logger logger = Logger.getLogger(HttpRequestUtils.class.getName());
/**
* 向指定URL發送GET方法的請求
*
* @param url 發送請求的URL
* @param param 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。
* @return URL 所代表遠程資源的響應結果
*/
public static String sendGetRequest(String url, String param) throws Exception {
StringBuilder stringBuilder = new StringBuilder(); // 用來接受返回值
BufferedReader bufferedReader = null;
try {
if (null != url && null != param) {
String getUrlStr = url + "?" + param;
URL getUrl = new URL(getUrlStr);
// 根據拼湊的URL,打開連接,URL.openConnection函數會根據URL的類型,返回不同的URLConnection子類的對象,這裏返回的是HttpURLConnection
HttpURLConnection httpURLConnection = (HttpURLConnection) getUrl.openConnection();
httpURLConnection.setRequestProperty(" Content-Type ", " application/x-www-form-urlencoded ");
// 建立實際的連接,但是實際上get請求要在下一句的getInputStream()函數中才會真正發到服務器
httpURLConnection.connect();
// 定義 BufferedReader輸入流來讀取URL的響應
bufferedReader =
new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "utf-8")); // 設置編碼,否則中文亂碼
String line;
while (null != (line = bufferedReader.readLine())) {
stringBuilder.append(line);
}
httpURLConnection.disconnect(); // 斷開連接
return stringBuilder.toString();
}
} catch (Exception e) {
System.out.println("發送GET請求出現異常!" + e);
logger.error(e);
} finally { // 使用finally塊來關閉輸入流
try {
if (null != bufferedReader) {
bufferedReader.close();
}
} catch (Exception e2) {
logger.error(e2);
}
}
return null;
}
/**
* 向指定 URL 發送POST方法的請求
*
* @param url 發送請求的 URL
* @param param 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。
* @return 所代表遠程資源的響應結果
*/
public static String sendPostRequest(String url, String param) throws Exception {
DataOutputStream dataOutputStream = null;
BufferedReader bufferedReader = null;
StringBuilder stringBuilder = new StringBuilder(); // 用來接受返回值
try {
if (null != url && null != param) {
URL postUrl = new URL(url);
// 打開和URL之間的連接
HttpURLConnection httpURLConnection = (HttpURLConnection) postUrl.openConnection();
// 設置通用的請求屬性
httpURLConnection.setRequestMethod("POST"); // 設置post方法,默認是get方法
httpURLConnection.setUseCaches(false); // post請求不能使用緩存
// 配置本次連接的Content-type,配置爲application/x-www-form-urlencoded的意思是正文是urlencoded編碼過的form參數,下面我們可以看到我們對正文內容使用URLEncoder.encode進行編碼
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 發送POST請求必須設置如下兩行
httpURLConnection.setDoOutput(true); // 設置是否向connection輸出,因爲這個是post請求,參數要放在http正文內,因此需要設爲true
httpURLConnection.setDoInput(true); // 從connection讀入,默認是true
// 連接,從openConnection()至此的配置必須要在connect之前完成,要注意的是getOutputStream會隱含的進行connect。
// 建立實際的連接
httpURLConnection.connect();
// 獲取URLConnection對象對應的輸出流
dataOutputStream = new DataOutputStream(httpURLConnection.getOutputStream());
// 發送請求參數,writeBytes將字符串中的16位的unicode字符以8位的字符形式寫道流裏面
dataOutputStream.writeBytes(param);
// 刷新對象輸出流,將任何字節都寫入潛在的流中
dataOutputStream.flush();
// 定義BufferedReader輸入流來讀取URL的響應
bufferedReader =
new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "utf-8")); // 設置編碼,否則中文亂碼
String line;
while (null != (line = bufferedReader.readLine())) {
stringBuilder.append(line);
}
httpURLConnection.disconnect(); // 斷開連接
return stringBuilder.toString();
}
} catch (Exception e) {
System.out.println("發送 POST 請求出現異常!" + e);
logger.error(e);
} finally { // 使用finally塊來關閉輸出流、輸入流
try {
if (null != dataOutputStream) {
dataOutputStream.close();
}
if (null != bufferedReader) {
bufferedReader.close();
}
} catch (Exception e2) {
logger.error(e2);
}
}
return null;
}
}