Java模拟Post表单提交 302 302 HTTP1.0 HTTP1.1问题解决

最近遇到了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

你可能感兴趣的:(java,apache,html,tomcat,cgi)