最近遇到了302和301,还有HTTP1.0和HTTP1.1的问题。这一切的一切都来源于“我要用Java模拟一个Post表单提交”抓取商品是否存在。好了,不多说了,把我最终测试成功的代码呈上,与大家分享。
package com.lj.util;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
/**
* Java模拟Post提交
* @author LiangJian
* 2011-6-1 10:13:32
*/
public class PostHttp {
/**
* Java模拟Post提交
* @param url 要提交到的位置
* @param data 例如:NameValuePair[] data = {new NameValuePair("key", "nike"),new NameValuePair("proClass", "")};
* @return 返回HTML代码
*/
public static String methodPost(String url,NameValuePair[] data){
String response= "";//要返回的response信息
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(url);
// 将表单的值放入postMethod中
postMethod.setRequestBody(data);
// 执行postMethod
int statusCode = 0;
try {
statusCode = httpClient.executeMethod(postMethod);
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
// 301或者302
if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY
|| statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
// 从头中取出转向的地址
Header locationHeader = postMethod.getResponseHeader("location");
String location = null;
if (locationHeader != null) {
location = locationHeader.getValue();
System.out.println("The page was redirected to:" + location);
response= methodPost(location,data);//用跳转后的页面重新请求。
} else {
System.err.println("Location field value is null.");
}
} else {
System.out.println(postMethod.getStatusLine());
try {
response= postMethod.getResponseBodyAsString();
} catch (IOException e) {
e.printStackTrace();
}
postMethod.releaseConnection();
}
return response;
}
/**
* @param args
*/
public static void main(String[] args) {
String url = "http://www.shopin.net/search.html";
Map<String,String> m = new HashMap<String,String>();
m.put("key", "nike");
m.put("proClass", "");
NameValuePair[] data = {new NameValuePair("key", "nike"),new NameValuePair("proClass", "")};
String response= methodPost(url,data);
System.out.println(response);
}
}
其中需要的jar包:
1、 commons-httpclient-3.1-rc1.zip http://jakarta.apache.org/commons/httpclient/downloads.html
2、commons-codec-1.3.jar http://jakarta.apache.org/site/downloads/downloads_commons-codec.cgi
3、commons-logging-api.jar 在tomcat5.5中的Tomcat 5.5\bin目录下或者 http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi
分享到:
相关推荐
1.6.2Post提交表单(模拟表单提交) /** * post方式提交表单(模拟用户登录请求) */ public void postForm() { // 创建默认的httpClient实例. CloseableHttpClient httpclient = HttpClients.createDefault...
POST方法常用于提交数据,请求参数在请求体中,可传输大量数据,如表单提交或文件上传。 多线程技术在此实验中至关重要,因为它可以提高并发性能。当多个客户端同时请求服务器时,服务器可以通过创建多个线程来处理...
HttpClient支持多种HTTP协议版本,包括HTTP/1.0和HTTP/1.1,并且具有处理重定向、认证、缓存、代理、连接管理等高级特性。它还允许开发者创建复杂的HTTP请求,如POST、PUT、DELETE等,并能处理响应,包括解析和验证...
1. 支持 HTTP/1.0 和 HTTP/1.1 协议。 2. 多种连接管理策略,如连接池和重用。 3. 支持各种认证机制,如基本认证、摘要认证等。 4. 支持 HTTP 方法,如 GET、POST、PUT、DELETE 等。 5. 高效的请求和响应处理,包括...
HttpClient4.1不仅支持HTTP 1.0和HTTP 1.1,还包含了对HTTPS协议的支持,这使得它在处理需要安全连接的应用场景中显得尤为有用。 HttpClient4.1的基本功能包括但不限于以下几点: **环境准备**: 在开始使用...
- POST:提交数据,常用于表单提交或创建新资源。 - HEAD:类似GET,但只返回头部信息,不返回实体主体。 - PUT:更新已有资源。 - DELETE:删除资源。 - OPTIONS:询问服务器支持哪些HTTP方法。 - TRACE:...
这个版本的Xerces提供了对XML 1.0和1.1规范的支持,以及XML Schema和Namespaces的处理。 3. **httpclient-4.5.2.jar**:Apache HttpClient是一个用于执行HTTP请求的Java库。HTMLUnit使用HttpClient来处理网络通信,...