采用Jakarta的HttpClient API模拟客户端GET和POST提交
最近搞一个扣网页内容的SessionBean,需要模拟客户端post提交,然后得到servlet返回的结果。
采用Jakarta的HttpClient API解决之.
HttpClient扩展和增强了标准java.net包,是一个内容广泛的代码库,功能极其丰富,能够构造出各
种使用HTTP协议的分布式应用,或者也可以嵌入到现有应用,为应用增加访问HTTP协议的能力
要求:
1:CLASSPATH中有commons-httpclient.jar,common-logging.jar
2:确保%JAVA_HOME% /jre/lib/security/java.security文件包含这行代码:
security.provider.2= com.sun.net.ssl.internal.ssl.Provider。
一:GET方法测试代码:
/**/
/*
* Created on Sep 25, 2006
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package co.iproxy.http;
import java.io.IOException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
/** */ /**
* @author lichunlei
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class HttpClientGetMethodTest
... {
public static void main(String[] args)
... {
HttpClient client = new HttpClient();
String url = " http://192.168.0.79:9080/Icare/IcareTest/index.jsp " ;
GetMethod method = new GetMethod(url);
try
... {
client.executeMethod(method);
if (method.getStatusCode() == HttpStatus.SC_OK)
... {
String response = method.getResponseBodyAsString();
System.out.println(response);
}
}
catch (HttpException e)
... {
e.printStackTrace();
}
catch (IOException e)
... {
e.printStackTrace();
}
finally
... {
method.releaseConnection();
method.recycle();
}
}
}
* Created on Sep 25, 2006
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package co.iproxy.http;
import java.io.IOException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
/** */ /**
* @author lichunlei
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class HttpClientGetMethodTest
... {
public static void main(String[] args)
... {
HttpClient client = new HttpClient();
String url = " http://192.168.0.79:9080/Icare/IcareTest/index.jsp " ;
GetMethod method = new GetMethod(url);
try
... {
client.executeMethod(method);
if (method.getStatusCode() == HttpStatus.SC_OK)
... {
String response = method.getResponseBodyAsString();
System.out.println(response);
}
}
catch (HttpException e)
... {
e.printStackTrace();
}
catch (IOException e)
... {
e.printStackTrace();
}
finally
... {
method.releaseConnection();
method.recycle();
}
}
}
二:POST方法测试代码:
/**/
/*
* Created on Sep 25, 2006
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package co.iproxy.http;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.httpclient.DefaultMethodRetryHandler;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
/** */ /**
* @author lichunlei
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class HttpClientPostMethodTest
... {
static int BASE_BODY_SIZE = 10240 ;
static int INC_BODY_SIZE = 51200 ;
public static void main(String[] args)
... {
String request = null ;
String url = " http://132.201.69.80:5080/BISWeb/Servicelet " ;
String result = null ;
String filePath = " D:/OPS_piese_idl36(from cvs)/Ntelagent/co/iproxy/http/request.txt " ;
File f = new File(filePath);
FileReader fileReader = null ;
try
... {
fileReader = new FileReader(f);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String currentLine;
StringBuffer content = new StringBuffer();
while ((currentLine = bufferedReader.readLine()) != null )
... {
content.append(currentLine);
}
request = content.toString();
}
catch (Exception e1)
... {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println( " the request is: " + request);
DefaultMethodRetryHandler retryhandler = new DefaultMethodRetryHandler();
retryhandler.setRequestSentRetryEnabled( true );
retryhandler.setRetryCount( 2 ); // retry 2 times
HttpClient httpClient = new HttpClient();
PostMethod method = new PostMethod(url);
InputStream data = new ByteArrayInputStream(request.getBytes());
method.setRequestBody(data);
method.setFollowRedirects( true );
method.setMethodRetryHandler(retryhandler);
try
... {
// execute the method
HostConfiguration cf = new HostConfiguration();
System.out.println( " use proxy " );
cf.setProxy( " 192.168.254.212 " , 4480 );
httpClient.setHostConfiguration(cf);
// httpClient.setTimeout(10000000);
int retcode = httpClient.executeMethod(method);
if (retcode == HttpStatus.SC_OK)
... {
byte [] responseBody = new byte [BASE_BODY_SIZE];
java.io.InputStream istream = method.getResponseBodyAsStream();
int npos = 0 ;
int nread = 0 ;
while ((nread = istream.read(responseBody, npos, responseBody.length - npos)) >= 0 )
... {
npos += nread;
if (npos >= responseBody.length)
... {
byte [] tmpBuf = new byte [npos + INC_BODY_SIZE];
System.arraycopy(responseBody, 0 , tmpBuf, 0 , npos);
responseBody = tmpBuf;
}
}
result = new String(responseBody, 0 , npos);
}
else
... {
throw new IOException( " failed to send request: retcode: " + retcode);
}
}
catch (Exception e)
... {
}
finally
... {
System.out.println( " lcl test in httpClient: " + result);
}
}
}
* Created on Sep 25, 2006
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package co.iproxy.http;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.httpclient.DefaultMethodRetryHandler;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
/** */ /**
* @author lichunlei
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class HttpClientPostMethodTest
... {
static int BASE_BODY_SIZE = 10240 ;
static int INC_BODY_SIZE = 51200 ;
public static void main(String[] args)
... {
String request = null ;
String url = " http://132.201.69.80:5080/BISWeb/Servicelet " ;
String result = null ;
String filePath = " D:/OPS_piese_idl36(from cvs)/Ntelagent/co/iproxy/http/request.txt " ;
File f = new File(filePath);
FileReader fileReader = null ;
try
... {
fileReader = new FileReader(f);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String currentLine;
StringBuffer content = new StringBuffer();
while ((currentLine = bufferedReader.readLine()) != null )
... {
content.append(currentLine);
}
request = content.toString();
}
catch (Exception e1)
... {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println( " the request is: " + request);
DefaultMethodRetryHandler retryhandler = new DefaultMethodRetryHandler();
retryhandler.setRequestSentRetryEnabled( true );
retryhandler.setRetryCount( 2 ); // retry 2 times
HttpClient httpClient = new HttpClient();
PostMethod method = new PostMethod(url);
InputStream data = new ByteArrayInputStream(request.getBytes());
method.setRequestBody(data);
method.setFollowRedirects( true );
method.setMethodRetryHandler(retryhandler);
try
... {
// execute the method
HostConfiguration cf = new HostConfiguration();
System.out.println( " use proxy " );
cf.setProxy( " 192.168.254.212 " , 4480 );
httpClient.setHostConfiguration(cf);
// httpClient.setTimeout(10000000);
int retcode = httpClient.executeMethod(method);
if (retcode == HttpStatus.SC_OK)
... {
byte [] responseBody = new byte [BASE_BODY_SIZE];
java.io.InputStream istream = method.getResponseBodyAsStream();
int npos = 0 ;
int nread = 0 ;
while ((nread = istream.read(responseBody, npos, responseBody.length - npos)) >= 0 )
... {
npos += nread;
if (npos >= responseBody.length)
... {
byte [] tmpBuf = new byte [npos + INC_BODY_SIZE];
System.arraycopy(responseBody, 0 , tmpBuf, 0 , npos);
responseBody = tmpBuf;
}
}
result = new String(responseBody, 0 , npos);
}
else
... {
throw new IOException( " failed to send request: retcode: " + retcode);
}
}
catch (Exception e)
... {
}
finally
... {
System.out.println( " lcl test in httpClient: " + result);
}
}
}
以上两个class已经包含了大部分常用的模拟http客户端的技术了,包括设置代理服务器,提交表单,得到返回结果等.
通过上面的测试代码,已经可以初步解决扣网页的问题了.现在备份一下我的实现方法(不是很通用,需要进一步完善), 同时也供大家参考.
/**/
/*
* Created on Sep 25, 2006
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package co.iproxy.http;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import org.apache.commons.httpclient.DefaultMethodRetryHandler;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
/** */ /**
* @author lichunlei
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class HttpService implements ServiceInterface ... {
private HttpClient httpClient = new HttpClient();
private DefaultMethodRetryHandler retryhandler = null ;
private String url = null ;
static int BASE_BODY_SIZE = 10240 ;
static int INC_BODY_SIZE = 51200 ;
public HttpService() throws MalformedURLException ... {
this .createMethodRetryHandler();
this .setHostConfiguration();
}
private void createMethodRetryHandler() ... {
retryhandler = new DefaultMethodRetryHandler();
retryhandler.setRequestSentRetryEnabled( true );
retryhandler.setRetryCount( 2 ); // retry 2 times
}
private void setHostConfiguration() throws MalformedURLException ... {
this .url = " http://132.201.69.80:5080/BISWeb/Servicelet " ;
String host = " 132.201.69.80 " ;
int port = 5080 ;
String protocol = " http " ;
if (url != null && ! url.trim().equals( "" )) ... {
java.net.URL nurl = new java.net.URL(url);
host = nurl.getHost();
port = nurl.getPort();
protocol = nurl.getProtocol();
}
setHostConfiguration(host, port, protocol);
}
/** */ /**
* Set host configuration
*
* @param host host name/ip
* @param port port number
* @param protocol protocol name (e.g. "jakarta.apache.org" )
*/
private void setHostConfiguration(String host, int port, String protocol) ... {
// Set the default host/protocol for the methods to connect to.
// This value will only be used if the methods are not given an absolute URI
httpClient.getHostConfiguration().setHost(
((host == null || host.trim().equals( "" )) ? " localhost " : host),
(port <= 0 ? 80 : port),
((protocol == null || protocol.trim().equals( "" ))
? " http "
: protocol));
}
public String process(String request) throws IOException ... {
String result = null ;
PostMethod method = new PostMethod(url);
InputStream data = new ByteArrayInputStream(request.getBytes());
method.setRequestBody(data);
method.setFollowRedirects( true );
method.setMethodRetryHandler(retryhandler);
try ... {
// execute the method
HostConfiguration cf = new HostConfiguration();
System.out.println( " use proxy " );
cf.setProxy( " 192.168.254.212 " , 4480 );
httpClient.setHostConfiguration(cf);
// httpClient.setTimeout(10000000);
int retcode = httpClient.executeMethod(method);
if (retcode == HttpStatus.SC_OK) ... {
byte [] responseBody = new byte [BASE_BODY_SIZE];
// byte[] responseBody = body;
java.io.InputStream istream = method.getResponseBodyAsStream();
int npos = 0 ;
int nread = 0 ;
while ((nread =
istream.read(
responseBody,
npos,
responseBody.length - npos))
>= 0 ) ... {
npos += nread;
if (npos >= responseBody.length) ... {
byte [] tmpBuf = new byte [npos + INC_BODY_SIZE];
System.arraycopy(responseBody, 0 , tmpBuf, 0 , npos);
responseBody = tmpBuf;
}
}
// byte[] responseBody = method.getResponseBody();
result = new String(responseBody, 0 , npos);
} else ... {
throw new IOException(
" failed to send request: retcode: " + retcode);
}
} catch (java.io.IOException iex) ... {
throw iex;
} finally ... {
// always release the connection after the request is done
method.releaseConnection();
if (data != null ) ... {
try ... {
data.close();
} catch (Exception ex) ... {
}
}
}
return result;
}
/**/ /* (non-Javadoc)
* @see co.iproxy.http.ServiceInterface#syncRequest(java.lang.String)
*/
public String syncRequest(String request) throws IOException ... {
return this .process(request);
}
/**/ /* (non-Javadoc)
* @see co.iproxy.http.ServiceInterface#asyncRequest(java.lang.String)
*/
public String request(String request) throws IOException ... {
return this .process(request);
}
}
* Created on Sep 25, 2006
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package co.iproxy.http;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import org.apache.commons.httpclient.DefaultMethodRetryHandler;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
/** */ /**
* @author lichunlei
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class HttpService implements ServiceInterface ... {
private HttpClient httpClient = new HttpClient();
private DefaultMethodRetryHandler retryhandler = null ;
private String url = null ;
static int BASE_BODY_SIZE = 10240 ;
static int INC_BODY_SIZE = 51200 ;
public HttpService() throws MalformedURLException ... {
this .createMethodRetryHandler();
this .setHostConfiguration();
}
private void createMethodRetryHandler() ... {
retryhandler = new DefaultMethodRetryHandler();
retryhandler.setRequestSentRetryEnabled( true );
retryhandler.setRetryCount( 2 ); // retry 2 times
}
private void setHostConfiguration() throws MalformedURLException ... {
this .url = " http://132.201.69.80:5080/BISWeb/Servicelet " ;
String host = " 132.201.69.80 " ;
int port = 5080 ;
String protocol = " http " ;
if (url != null && ! url.trim().equals( "" )) ... {
java.net.URL nurl = new java.net.URL(url);
host = nurl.getHost();
port = nurl.getPort();
protocol = nurl.getProtocol();
}
setHostConfiguration(host, port, protocol);
}
/** */ /**
* Set host configuration
*
* @param host host name/ip
* @param port port number
* @param protocol protocol name (e.g. "jakarta.apache.org" )
*/
private void setHostConfiguration(String host, int port, String protocol) ... {
// Set the default host/protocol for the methods to connect to.
// This value will only be used if the methods are not given an absolute URI
httpClient.getHostConfiguration().setHost(
((host == null || host.trim().equals( "" )) ? " localhost " : host),
(port <= 0 ? 80 : port),
((protocol == null || protocol.trim().equals( "" ))
? " http "
: protocol));
}
public String process(String request) throws IOException ... {
String result = null ;
PostMethod method = new PostMethod(url);
InputStream data = new ByteArrayInputStream(request.getBytes());
method.setRequestBody(data);
method.setFollowRedirects( true );
method.setMethodRetryHandler(retryhandler);
try ... {
// execute the method
HostConfiguration cf = new HostConfiguration();
System.out.println( " use proxy " );
cf.setProxy( " 192.168.254.212 " , 4480 );
httpClient.setHostConfiguration(cf);
// httpClient.setTimeout(10000000);
int retcode = httpClient.executeMethod(method);
if (retcode == HttpStatus.SC_OK) ... {
byte [] responseBody = new byte [BASE_BODY_SIZE];
// byte[] responseBody = body;
java.io.InputStream istream = method.getResponseBodyAsStream();
int npos = 0 ;
int nread = 0 ;
while ((nread =
istream.read(
responseBody,
npos,
responseBody.length - npos))
>= 0 ) ... {
npos += nread;
if (npos >= responseBody.length) ... {
byte [] tmpBuf = new byte [npos + INC_BODY_SIZE];
System.arraycopy(responseBody, 0 , tmpBuf, 0 , npos);
responseBody = tmpBuf;
}
}
// byte[] responseBody = method.getResponseBody();
result = new String(responseBody, 0 , npos);
} else ... {
throw new IOException(
" failed to send request: retcode: " + retcode);
}
} catch (java.io.IOException iex) ... {
throw iex;
} finally ... {
// always release the connection after the request is done
method.releaseConnection();
if (data != null ) ... {
try ... {
data.close();
} catch (Exception ex) ... {
}
}
}
return result;
}
/**/ /* (non-Javadoc)
* @see co.iproxy.http.ServiceInterface#syncRequest(java.lang.String)
*/
public String syncRequest(String request) throws IOException ... {
return this .process(request);
}
/**/ /* (non-Javadoc)
* @see co.iproxy.http.ServiceInterface#asyncRequest(java.lang.String)
*/
public String request(String request) throws IOException ... {
return this .process(request);
}
}