|
|
最近遇到了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);// 执行postMethodint statusCode = 0;try {statusCode = httpClient.executeMethod(postMethod);} catch (HttpException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发// 301或者302if (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 |
|