轉自:http://winhonourxzg.javaeye.com/blog/461219
請求模拟
package org.zlex.commons.net;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Properties;
/**
* 網絡工具
*
* @author 梁棟
* @version 1.0
* @since 1.0
*/
public abstract class NetUtils {
public static final String CHARACTER_ENCODING = "UTF-8";
public static final String PATH_SIGN = "/";
public static final String METHOD_POST = "POST";
public static final String METHOD_GET = "GET";
public static final String CONTENT_TYPE = "Content-Type";
/**
* 以POST方式向指定位址發送資料包請求,并取得傳回的資料包
*
* @param urlString
* @param requestData
* @return 傳回資料包
* @throws Exception
*/
public static byte[] requestPost(String urlString, byte[] requestData)
throws Exception {
Properties requestProperties = new Properties();
requestProperties.setProperty(CONTENT_TYPE,
"application/octet-stream; charset=utf-8");
return requestPost(urlString, requestData, requestProperties);
}
* @param requestProperties
public static byte[] requestPost(String urlString, byte[] requestData,
Properties requestProperties) throws Exception {
byte[] responseData = null;
HttpURLConnection con = null;
try {
URL url = new URL(urlString);
con = (HttpURLConnection) url.openConnection();
if ((requestProperties != null) && (requestProperties.size() > 0)) {
for (Map.Entry<Object, Object> entry : requestProperties
.entrySet()) {
String key = String.valueOf(entry.getKey());
String value = String.valueOf(entry.getValue());
con.setRequestProperty(key, value);
}
}
con.setRequestMethod(METHOD_POST); // 置為POST方法
con.setDoInput(true); // 開啟輸入流
con.setDoOutput(true); // 開啟輸出流
// 如果請求資料不為空,輸出該資料。
if (requestData != null) {
DataOutputStream dos = new DataOutputStream(con
.getOutputStream());
dos.write(requestData);
dos.flush();
dos.close();
int length = con.getContentLength();
// 如果回複消息長度不為-1,讀取該消息。
if (length != -1) {
DataInputStream dis = new DataInputStream(con.getInputStream());
responseData = new byte[length];
dis.readFully(responseData);
dis.close();
} catch (Exception e) {
throw e;
} finally {
if (con != null) {
con.disconnect();
con = null;
}
return responseData;
* 以POST方式向指定位址送出表單<br>
* arg0=urlencode(value0)&arg1=urlencode(value1)
* @param formProperties
public static byte[] requestPostForm(String urlString,
Properties formProperties) throws Exception {
return requestPostForm(urlString, formProperties, null);
Properties formProperties, Properties requestProperties)
requestProperties.setProperty(HttpUtils.CONTENT_TYPE,
"application/x-www-form-urlencoded");
StringBuilder sb = new StringBuilder();
if ((formProperties != null) && (formProperties.size() > 0)) {
for (Map.Entry<Object, Object> entry : formProperties.entrySet()) {
String key = String.valueOf(entry.getKey());
String value = String.valueOf(entry.getValue());
sb.append(key);
sb.append("=");
sb.append(encode(value));
sb.append("&");
String str = sb.toString();
str = str.substring(0, (str.length() - 1)); // 截掉末尾字元&
return requestPost(urlString, str.getBytes(CHARACTER_ENCODING),
requestProperties);
* url解碼
* @param str
* @return 解碼後的字元串,當異常時傳回原始字元串。
public static String decode(String url) {
return URLDecoder.decode(url, CHARACTER_ENCODING);
} catch (UnsupportedEncodingException ex) {
return url;
* url編碼
* @return 編碼後的字元串,當異常時傳回原始字元串。
public static String encode(String url) {
return URLEncoder.encode(url, CHARACTER_ENCODING);
}
/**
* 2008-12-26
*/
package org.zlex.commons.net;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Map;
import java.util.Properties;
* 網絡工具
*
* @author 梁棟
* @version 1.0
* @since 1.0
public abstract class NetUtils {
public static final String CHARACTER_ENCODING = "UTF-8";
public static final String PATH_SIGN = "/";
public static final String METHOD_POST = "POST";
public static final String METHOD_GET = "GET";
public static final String CONTENT_TYPE = "Content-Type";
* 以POST方式向指定位址發送資料包請求,并取得傳回的資料包
* @param urlString
* @param requestData
* @return 傳回資料包
* @throws Exception
public static byte[] requestPost(String urlString, byte[] requestData)
throws Exception {
Properties requestProperties = new Properties();
requestProperties.setProperty(CONTENT_TYPE,
"application/octet-stream; charset=utf-8");
return requestPost(urlString, requestData, requestProperties);
}
* @param requestProperties
public static byte[] requestPost(String urlString, byte[] requestData,
Properties requestProperties) throws Exception {
byte[] responseData = null;
HttpURLConnection con = null;
try {
URL url = new URL(urlString);
con = (HttpURLConnection) url.openConnection();
if ((requestProperties != null) && (requestProperties.size() > 0)) {
for (Map.Entry<Object, Object> entry : requestProperties
.entrySet()) {
String key = String.valueOf(entry.getKey());
String value = String.valueOf(entry.getValue());
con.setRequestProperty(key, value);
con.setRequestMethod(METHOD_POST); // 置為POST方法
con.setDoInput(true); // 開啟輸入流
con.setDoOutput(true); // 開啟輸出流
// 如果請求資料不為空,輸出該資料。
if (requestData != null) {
DataOutputStream dos = new DataOutputStream(con
.getOutputStream());
dos.write(requestData);
dos.flush();
dos.close();
int length = con.getContentLength();
// 如果回複消息長度不為-1,讀取該消息。
if (length != -1) {
DataInputStream dis = new DataInputStream(con.getInputStream());
responseData = new byte[length];
dis.readFully(responseData);
dis.close();
} catch (Exception e) {
throw e;
} finally {
if (con != null) {
con.disconnect();
con = null;
return responseData;
* 以POST方式向指定位址送出表單<br>
* arg0=urlencode(value0)&arg1=urlencode(value1)
* @param formProperties
public static byte[] requestPostForm(String urlString,
Properties formProperties) throws Exception {
return requestPostForm(urlString, formProperties, null);
Properties formProperties, Properties requestProperties)
requestProperties.setProperty(HttpUtils.CONTENT_TYPE,
"application/x-www-form-urlencoded");
StringBuilder sb = new StringBuilder();
if ((formProperties != null) && (formProperties.size() > 0)) {
for (Map.Entry<Object, Object> entry : formProperties.entrySet()) {
sb.append(key);
sb.append("=");
sb.append(encode(value));
sb.append("&");
String str = sb.toString();
str = str.substring(0, (str.length() - 1)); // 截掉末尾字元&
return requestPost(urlString, str.getBytes(CHARACTER_ENCODING),
requestProperties);
* url解碼
* @param str
* @return 解碼後的字元串,當異常時傳回原始字元串。
public static String decode(String url) {
return URLDecoder.decode(url, CHARACTER_ENCODING);
} catch (UnsupportedEncodingException ex) {
return url;
* url編碼
* @return 編碼後的字元串,當異常時傳回原始字元串。
public static String encode(String url) {
return URLEncoder.encode(url, CHARACTER_ENCODING);
注意上述requestPostForm()方法,是用來送出表單的。
測試用例
Java代碼
* 2009-8-21
import static org.junit.Assert.*;
import org.junit.Test;
* 網絡工具測試
public class NetUtilsTest {
* Test method for
* {@link org.zlex.commons.net.NetUtils#requestPost(java.lang.String, byte[])}
* .
@Test
public final void testRequestPostStringByteArray() throws Exception {
// 模拟浏覽器資訊
requestProperties
.put(
"User-Agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; .NET CLR 1.1.4322)");
byte[] b = NetUtils.requestPost("http://localhost:8080/zlex/post.do",
"XML".getBytes());
System.err.println(new String(b, "utf-8"));
* {@link org.zlex.commons.net.NetUtils#requestPostForm(java.lang.String, java.util.Properties)}
public final void testRequestPostForm() throws Exception {
Properties formProperties = new Properties();
formProperties.put("j_username", "Admin");
formProperties.put("j_password", "manage");
byte[] b = NetUtils.requestPostForm(
"http://localhost:8080/zlex/j_spring_security_check",
formProperties);