最近遇到了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
分享到:
相关推荐
HTTP1.1是在HTTP1.0基础上的升级,旨在解决1.0版本的一些问题,增强了性能和功能: 1. **持久连接**:引入了持久连接(Keep-Alive),允许在一个TCP连接上发送多个请求和响应,减少了连接的创建和关闭,提高了效率...
- **POST**:请求服务器接收并处理随请求附带的数据。 - **PUT**:请求服务器存储一个资源,并用请求数据中的数据更新已存在的资源。 - **DELETE**:请求服务器删除Request-URI标识的资源。 2. **Request-URI** ...
Java作为一个强大的后端开发语言,提供了多种库来帮助开发者模拟表单的POST提交,其中之一就是Apache的HttpClient。 HttpClient是一个功能丰富的HTTP客户端编程工具包,它允许Java开发者以编程的方式执行HTTP请求,...
### C#以POST方式模拟提交表单 - 关键知识点解析 #### 一、知识点概览 本文档将基于“c#以POST方式模拟提交表单”这一主题进行深入解析,主要内容涉及C#语言如何实现HTTP POST请求来模拟提交表单数据,并通过具体的...
在这个压缩包中包含的两个文件,RFC2616(HTTP/1.1)中文版.pdf和RFC1945(HTTP/1.0)中文版.pdf,分别是对HTTP 1.1和HTTP 1.0协议的官方文档的中文翻译。 HTTP 1.0是早期的版本,它定义了HTTP的基本操作,如GET、...
Java 模拟Ajax POST GET 提交代码,实测很好用。
lua-http是一个针对Lua编程语言的高效HTTP库,其核心特性在于全面支持HTTP 1.0、1.1和2.0协议,不仅适用于客户端请求,还具备构建HTTP服务器的能力。这个库的出现,极大地拓展了Lua在Web服务开发中的应用范围,为...
这里的"post模拟登录,提交表单"涉及到HTTP请求方式中的POST方法,以及如何处理登录过程和后续的表单提交。 首先,我们需要理解HTTP的POST方法。在Web应用中,GET方法用于获取资源,而POST方法则常用于发送数据到...
本篇文章将深入探讨如何使用C#实现POST方式提交Form表单,这对于网络应用程序的开发至关重要,因为它允许我们向服务器发送数据,比如登录、注册、提交表单等操作。 1. **HTTP POST方法**: HTTP协议提供了两种主要...
java中用URLConnection类post方式提交表单 java中用URLConnection类post方式提交表单是指在java应用程序中使用java.net.URLConnection类来实现POST方式的表单提交。POST方式是HTTP协议中的一种常见的请求方法,它...
java http-post form表单客户端请求代码,拿过去直接应用即可
在本文中,我们将深入探讨如何通过模拟POST表单上传文件到服务器,这是一项常见的任务,尤其在开发Web应用程序时。我们将涵盖客户端如何构建请求以及服务器如何接收和处理这些请求。 首先,让我们理解POST请求的...