天天看點

java 模拟HTTP doPost請求 設定參數

轉自: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);