标签归档:HttpClient

HTTPClient请求网页抓取数据:验证是否301跳转

转载声明:本文章由 尚缘网络 于 2013-07-09 22:20:03 发表在 JavaApp 栏目,转载请注明出自:http://www.sxrczx.com/t/article/3864b5a8c2774191bcb7972246c8d578.htm

制作一个简单的WEB工具:在线检测永久重定向301是否设置成功,碰到了一些问题,记录如下:

DefaultHttpClient获取StatusCode,代码片段如下:

DefaultHttpClient client = new DefaultHttpClient(); 
//使用Get方式请求
HttpGet httpget = new HttpGet("http://sxrczx.com");
//执行请求
try {
HttpResponse response = client.execute(httpget);            System.out.println("httpclicent"+response.getStatusLine().getStatusCode());
} catch (ClientProtocolException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
}

遇到的问题:

通过response.getStatusLine().getStatusCode()获取到的状态码永远是(在保证资源能被访问到,并且正确配置了301重定向的情况下)200

原因分析:

既然返回HTTP status为200,证明HttpClient主动帮助我们处理了301重定向后续的请求,但是我们的目标是拿到重定向状态码即可,也就是说不再需要它主动帮我们处理301后续的问题。

解决办法:

继续阅读

java+HttpClient获取百度搜索结果重定向后的地址

百度搜索结果那长条真是恶心,来个获取百度301||302重定向后的真实地址。

 

import java.io.IOException;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.params.AllClientPNames;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpParams;


public class Redirect {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DefaultHttpClient client = new DefaultHttpClient();
        
        //使用Get方式请求
        HttpGet httpget = new HttpGet("http://www.baidu.com/link?url=ByBJLpHsj5nXx6DESXbmMjIrU5W4Eh0yg5wCQpe3kCQMlJK_RJBmdEYGm0DDTCoTDGaz7rH80gxjvtvoqJuYxK");
        HttpParams params = client.getParams();  
        params.setParameter(AllClientPNames.HANDLE_REDIRECTS, false);
           
        //执行请求
        try {
            HttpResponse response = client.execute(httpget);
            int statusCode=response.getStatusLine().getStatusCode();
            if(statusCode==301||statusCode==302)
            {
                Header[] hs = response.getHeaders("Location");
			     for(Header h:hs)
			     {
			    	 System.out.println(h.getName()+"--"+h.getValue());
			     }
            }
        } catch (ClientProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
	}

}

HttpClient超时设置

DefaultHttpClient:
请求超时
httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 60000);
读取超时
httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 60000);

HttpClient
HttpClient httpClient=new HttpClient();
链接超时
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(60000);
读取超时
httpClient.getHttpConnectionManager().getParams().setSoTimeout(60000)

HttpClient中文乱码的两种解决方案

引用:http://blog.csdn.net/roseey/article/details/5740279

最近使用HttpClient读取页面出现中文乱码问题,解决问题后写出本文章,希望能对大家有所帮助。

问题描述:HttpClient所读取的页面为UTF-8格式,使用如下方法读取后出现乱码问题,将读取内容转码无效。

 

public static String getHttpResponse(String url)
{
String result = null;
try{

HttpClient httpClient;
GetMethod getMethod;
httpClient = new HttpClient();
getMethod = new GetMethod(url);
getMethod.getParams().setParameter(“http.method.retry-handler”, new DefaultHttpMethodRetryHandler());
int statusCode = httpClient.executeMethod(getMethod);
if(statusCode == 200)
{
StringBuffer temp = new StringBuffer();
InputStream in = getMethod.getResponseBodyAsStream();
BufferedReader buffer = new BufferedReader(new InputStreamReader(in));
for(String tempstr = “”; (tempstr = buffer.readLine()) != null;)
temp = temp.append(tempstr);

buffer.close();
in.close();
result = temp.toString().trim();
} else
{
System.err.println((new StringBuilder(“Can’t get page:”)).append(url).append(“#”).append(getMethod.getStatusLine()).toString());
}
}catch(Exception e){
e.printStackTrace();
}
return result;
}

 

通常解决HttpClient乱码的一种方式是在读取时设置读取的编码,如:

httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, “UTF-8″);

但如果当前环境的默认编码不是”UTF-8″,这样也会有问题,因为在  BufferedReader buffer = new BufferedReader(new InputStreamReader(in));一句中,InputStreamReader将读入内容解码为平台默认编码,这样往往我们读入的内容第一时间就被转为乱码,之后可能我们无论再怎么转都不是所需的内容。对于这种情况,解决办法是设置InputStreamReader的指定编码,即:

BufferedReader buffer = new BufferedReader(new InputStreamReader(in,”UTF-8”));

HttpClient 学习整理

HttpClient 是我最近想研究的东西,以前想过的一些应用没能有很好的实现,发现这个开源项目之后就有点眉目了,令人头痛的cookie问题还是有办法解决滴。在网上整理了一些东西,写得很好,寄放在这里。

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient,更多使用 HttpClient 的应用可以参见http://wiki.apache.org/jakarta-httpclient/HttpClientPowered。HttpClient 项目非常活跃,使用的人还是非常多的。目前 HttpClient 版本是在 2005.10.11 发布的 3.0 RC4 。
继续阅读

HttpClient入门

摘自:http://www.ibm.com/developerworks/cn/opensource/os-httpclient/

httpClient简介

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient,更多使用 HttpClient 的应用可以参见http://wiki.apache.org/jakarta-httpclient/HttpClientPowered。HttpClient 项目非常活跃,使用的人还是非常多的。目前 HttpClient 版本是在 2005.10.11 发布的 3.0 RC4 。