最近搞一个扣网页内容的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方法测试代码:
/**//*
*CreatedonSep25,2006
*
*Tochangethetemplateforthisgeneratedfilegoto
*Window>Preferences>Java>CodeGeneration>CodeandComments
*/
packageco.iproxy.http;
importjava.io.IOException;
importorg.apache.commons.httpclient.HttpClient;
importorg.apache.commons.httpclient.HttpException;
importorg.apache.commons.httpclient.HttpStatus;
importorg.apache.commons.httpclient.methods.GetMethod;
/***//**
*@authorlichunlei
*
*Tochangethetemplateforthisgeneratedtypecommentgoto
*Window>Preferences>Java>CodeGeneration>CodeandComments
*/
publicclassHttpClientGetMethodTest
...{
publicstaticvoidmain(String[]args)
...{
HttpClientclient=newHttpClient();
Stringurl=http://192.18.0.19:9080/care/careTest/index.jsp;
GetMethodmethod=newGetMethod(url);
try
...{
client.executeMethod(method);
if(method.getStatusCode()==HttpStatus.SC_OK)
...{
Stringresponse=method.getResponseBodyAsString();
System.out.println(response);
}
}
catch(HttpExceptione)
...{
e.printStackTrace();
}
catch(IOExceptione)
...{
e.printStackTrace();
}
finally
...{
method.releaseConnection();
method.recycle();
}
}
}
二:POST方法测试代码:
/**//*
*CreatedonSep25,2006
*
*Tochangethetemplateforthisgeneratedfilegoto
*Window>Preferences>Java>CodeGeneration>CodeandComments
*/
packageco.iproxy.http;
importjava.io.BufferedReader;
importjava.io.ByteArrayInputStream;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileReader;
importjava.io.IOException;
importjava.io.InputStream;
importorg.apache.commons.httpclient.DefaultMethodRetryHandler;
importorg.apache.commons.httpclient.HostConfiguration;
importorg.apache.commons.httpclient.HttpClient;
importorg.apache.commons.httpclient.HttpStatus;
importorg.apache.commons.httpclient.methods.PostMethod;
/***//**
*@authorlichunlei
*
*Tochangethetemplateforthisgeneratedtypecommentgoto
*Window>Preferences>Java>CodeGeneration>CodeandComments
*/
publicclassHttpClientPostMethodTest
...{
staticintBASE_BODY_SIZE=10240;
staticintINC_BODY_SIZE=51200;
publicstaticvoidmain(String[]args)
...{
Stringrequest=null;
Stringurl=http://12.20.69.50:5080/Web/Servicelet;
Stringresult=null;
StringfilePath="D:/OPS_piese_idl36(fromcvs)/Ntelagent/co/iproxy/http/request.txt";
Filef=newFile(filePath);
FileReaderfileReader=null;
try
...{
fileReader=newFileReader(f);
BufferedReaderbufferedReader=newBufferedReader(fileReader);
StringcurrentLine;
StringBuffercontent=newStringBuffer();
while((currentLine=bufferedReader.readLine())!=null)
...{
content.append(currentLine);
}
request=content.toString();
}
catch(Exceptione1)
...{
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
System.out.println("therequestis:"+request);
DefaultMethodRetryHandlerretryhandler=newDefaultMethodRetryHandler();
retryhandler.setRequestSentRetryEnabled(true);
retryhandler.setRetryCount(2);//retry2times
HttpClienthttpClient=newHttpClient();
PostMethodmethod=newPostMethod(url);
InputStreamdata=newByteArrayInputStream(request.getBytes());
method.setRequestBody(data);
method.setFollowRedirects(true);
method.setMethodRetryHandler(retryhandler);
try
...{
//executethemethod
HostConfigurationcf=newHostConfiguration();
System.out.println("useproxy");
cf.setProxy("192.18.254.22",4480);
httpClient.setHostConfiguration(cf);
//httpClient.setTimeout(10000000);
intretcode=httpClient.executeMethod(method);
if(retcode==HttpStatus.SC_OK)
...{
byte[]responseBody=newbyte[BASE_BODY_SIZE];
java.io.InputStreamistream=method.getResponseBodyAsStream();
intnpos=0;
intnread=0;
while((nread=istream.read(responseBody,npos,responseBody.length-npos))>=0)
...{
npos+=nread;
if(npos>=responseBody.length)
...{
byte[]tmpBuf=newbyte[npos+INC_BODY_SIZE];
System.arraycopy(responseBody,0,tmpBuf,0,npos);
responseBody=tmpBuf;
}
}
result=newString(responseBody,0,npos);
}
else
...{
thrownewIOException("failedtosendrequest:retcode:"+retcode);
}
}
catch(Exceptione)
...{
}
finally
...{
System.out.println("lcltestinhttpClient:"+result);
}
}
}
以上两个class已经包含了大部分常用的模拟http客户端的技术了,包括设置代理服务器,提交表单,得到返回结果等.
通过上面的测试代码,已经可以初步解决扣网页的问题了.现在备份一下我的实现方法(不是很通用,需要进一步完善), 同时也供大家参考.
相关推荐
正如前面说到的,如果我们自己使用java.net.HttpURLConnection来搞定这些问题是很恐怖的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的httpclient,它隶属于Jakarta的...
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient,然后根据作者实际...
赠送jar包:jakarta.activation-api-1.2.1.jar; 赠送原API文档:jakarta.activation-api-1.2.1-javadoc.jar; 赠送源代码:jakarta.activation-api-1.2.1-sources.jar; 赠送Maven依赖信息文件:jakarta.activation...
赠送jar包:jakarta.servlet-api-4.0.4.jar; 赠送原API文档:jakarta.servlet-api-4.0.4-javadoc.jar; 赠送源代码:jakarta.servlet-api-4.0.4-sources.jar; 赠送Maven依赖信息文件:jakarta.servlet-api-4.0.4....
赠送jar包:jakarta.validation-api-2.0.1.jar; 赠送原API文档:jakarta.validation-api-2.0.1-javadoc.jar; 赠送源代码:jakarta.validation-api-2.0.1-sources.jar; 赠送Maven依赖信息文件:jakarta.validation...
赠送jar包:jakarta.validation-api-2.0.1.jar; 赠送原API文档:jakarta.validation-api-2.0.1-javadoc.jar; 赠送源代码:jakarta.validation-api-2.0.1-sources.jar; 赠送Maven依赖信息文件:jakarta.validation...
赠送jar包:jakarta.validation-api-2.0.2.jar; 赠送原API文档:jakarta.validation-api-2.0.2-javadoc.jar; 赠送源代码:jakarta.validation-api-2.0.2-sources.jar; 赠送Maven依赖信息文件:jakarta.validation...
赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...
赠送jar包:jakarta.activation-api-1.2.1.jar; 赠送原API文档:jakarta.activation-api-1.2.1-javadoc.jar; 赠送源代码:jakarta.activation-api-1.2.1-sources.jar; 赠送Maven依赖信息文件:jakarta.activation...
赠送jar包:jakarta.websocket-api-1.1.2.jar; 赠送原API文档:jakarta.websocket-api-1.1.2-javadoc.jar; 赠送源代码:jakarta.websocket-api-1.1.2-sources.jar; 赠送Maven依赖信息文件:jakarta.websocket-api...
赠送jar包:jakarta.activation-api-1.2.2.jar; 赠送原API文档:jakarta.activation-api-1.2.2-javadoc.jar; 赠送源代码:jakarta.activation-api-1.2.2-sources.jar; 赠送Maven依赖信息文件:jakarta.activation...
jakarta commons的API
赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache...
jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar jakarta-servletapi-5.rar
赠送jar包:jakarta.servlet-api-4.0.4.jar; 赠送原API文档:jakarta.servlet-api-4.0.4-javadoc.jar; 赠送源代码:jakarta.servlet-api-4.0.4-sources.jar; 赠送Maven依赖信息文件:jakarta.servlet-api-4.0.4....
赠送jar包:jakarta.activation-api-1.2.2.jar; 赠送原API文档:jakarta.activation-api-1.2.2-javadoc.jar; 赠送源代码:jakarta.activation-api-1.2.2-sources.jar; 赠送Maven依赖信息文件:jakarta.activation...
Jakarta POI API.解析MS Office文档
赠送jar包:jakarta.websocket-api-1.1.2.jar; 赠送原API文档:jakarta.websocket-api-1.1.2-javadoc.jar; 赠送源代码:jakarta.websocket-api-1.1.2-sources.jar; 赠送Maven依赖信息文件:jakarta.websocket-api...
包含翻译后的API文档:jakarta.el-3.0.3-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.glassfish:jakarta.el:3.0.3; 标签:glassfish、jakarta、el、中英对照文档、jar包、java; 使用方法:解压...