`
什么_况
  • 浏览: 53693 次
文章分类
社区版块
存档分类
最新评论

httpclient4.5 的一些细节

阅读更多

httpclient是Apache下的一个用于执行http网络访问的一个工具包。

大致流程:新建一个httpclient对象->新建一个httpRequest对象->用httpclient去执行->得到一个response->通过解析这个response来获取自己所需要的信息。

 

一、新建httpClient对象:

在httpClient4.5中,初始化的方式已经和以前版本有一些不同。

有大致以下几种方式:

static  CloseableHttpClient client = HttpClients.createDefault();
//最好使用static修饰,以保证用同一个client对象处理请求,以保存进度

 

static CloseableHttpClient httpClient=HttpClients.custom().build();

 此二种都是新建一个默认的httpClient对象。可以在第二种方法里添加一些网络访问选项设置。

/**
	 * initialize a instance of the httpClient depending on your own request
	 */
	private static CloseableHttpClient getInstanceClient() {
		CloseableHttpClient httpClient;
                StandardHttpRequestRetryHandler standardHandler = new StandardHttpRequestRetryHandler(5, true);
		HttpRequestRetryHandler handler = new HttpRequestRetryHandler() {

			@Override
			public boolean retryRequest(IOException arg0, int retryTimes, HttpContext arg2) {
				if (arg0 instanceof UnknownHostException || arg0 instanceof ConnectTimeoutException
						|| !(arg0 instanceof SSLException) || arg0 instanceof NoHttpResponseException) {
					return true;
				}
				if (retryTimes > 5) {
					return false;
				}
				HttpClientContext clientContext = HttpClientContext.adapt(arg2);
				HttpRequest request = clientContext.getRequest();
				boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
				if (idempotent) {
					// 如果请求被认为是幂等的,那么就重试。即重复执行不影响程序其他效果的
					return true;
				}
				return false;
			}
		};
		HttpHost proxy = new HttpHost("127.0.0.1", 80);// 设置代理ip
		DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
		httpClient = HttpClients.custom().setRoutePlanner(routePlanner).setRetryHandler(handler)
				.setConnectionTimeToLive(1, TimeUnit.DAYS).setDefaultCookieStore(cookieStore).build();
		return httpClient;
	}

 在该代码中分别设置了网络代理,重试处理,对于请求的keepalive时间,指定cookiestore用于保存cookie。

 

 

retryHandler:代码里给了两种方式。第一个是简便的用于设置重试,第一个参数为最大重试次数,第二个参数为请求在幂等情况下是否重试。第二种方式详细的规定了在发生了什么exception个下重试,以及幂等和重试次数下的重试情况。

routePlanner:httpClient支持代理。新建一个httphost对象传给一个routeplanner对象即可。httphost的构造方法中可以指定代理ip和端口

CookieStore:需要预先新建一个cookieStore对象。初始化方式如下:

CookieStore cookieStore = new BasicCookieStore();

 

二、执行get请求:

先上代码

/**
	 * used to get the html code from the url
	 */
static RequestConfig config = RequestConfig.custom().setConnectTimeout(6000).setSocketTimeout(6000)
			.setCookieSpec(CookieSpecs.STANDARD).build(); // 设置超时及cookie策略
	public static String getDemo(String url) {
		HttpGet get = new HttpGet(url);
		get.setConfig(config);
		HttpResponse response = null;
		String html = null;
		try {
			response = client.execute(get);
			int statusCode = response.getStatusLine().getStatusCode();// 连接代码
			Header[] headers = response.getAllHeaders();
			// 用于得到返回的文件头
			for (Header header : headers) {
				System.out.println(header);
			}
			html = new String(EntityUtils.toString(response.getEntity()).getBytes("iso8859-1"), "gb2312");
			// 在后面参数输入网站的编码,一般为utf-8
			// 返回的html代码,避免发生编码错误
			System.out.println(html);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return html;
	}

 大致流程:新建httpget对象->用httpClient执行->解析返回的response得到自己需要的内容

cookieSpec:即cookie策略。参数为cookiespecs的一些字段。作用:1、如果网站header中有set-cookie字段时,采用默认方式可能会被cookie reject,无法写入cookie。将此属性设置成CookieSpecs.STANDARD_STRICT可避免此情况。2、如果要想忽略cookie访问,则将此属性设置成CookieSpecs.IGNORE_COOKIES。

tips:注意网站编码,否则容易出现乱码

 

三、执行post请求:

/**
	 * used to post form data which is the url needed
	 */
	public static void postDemo(String url) {
		HttpPost post = new HttpPost(url);
		post.setConfig(config);
		post.setHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36");
		post.setHeader("Connection", "keep-alive");
		List<NameValuePair> list = new ArrayList<NameValuePair>();
		list.add(new BasicNameValuePair("key", "value"));
		list.add(new BasicNameValuePair("key", "value"));
		list.add(new BasicNameValuePair("key", "value"));
		list.add(new BasicNameValuePair("key", "value"));
		list.add(new BasicNameValuePair("key", "value"));
		try {
			HttpEntity entity = new UrlEncodedFormEntity(list, "utf-8");
			post.setEntity(entity);
			HttpResponse response = client.execute(post);
			String responseHtml = EntityUtils.toString(response.getEntity());
			System.out.println(responseHtml);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 大致流程:新建post对象->新建需要的表单页->将表单内容设置入请求中->执行并获得response

 

四:解析response:

得到html code:

String responseHtml = EntityUtils.toString(response.getEntity());

 得到http状态码:

int statusCode = response.getStatusLine().getStatusCode();// 连接代码

 得到response header:

response.getFirstHeader("key");// 得到第一个名字为key的header
			response.getHeaders("key");// 得到名字为key的所有header,返回一个数组
			response.getLastHeader("key");

 

得到inputstream:(下载网络部分资源的时候有可能会对cookie有要求,此时需要用到httpClient来下载。)例如验证码等等。

 

InputStream inputStream = response.getEntity().getContent();
 

 

五:管理cookie:

httpClient里默认自动管理cookie,如果想要提取cookie或者发送自定义的cookie,则需要在httpClient对象初始化时设置一个默认的cookiestore来保存。(方法见初始化httpClient对象里的setDefaultCookieStore)。

得到当前所有cookie:

 

List<Cookie> list = cookieStore.getCookies();// get all cookies
		System.out.println("cookie is:");
		System.out.println("-----------------------");
		for (Cookie cookie : list) {
			System.out.println(cookie);
		}
		System.out.println("-----------------------");
 清除所有cookie:

 

 

cookieStore.clear();
 发送自定义cookie:(new了一个对象之后可以设置多种属性。)

 

 

BasicClientCookie cookie = new BasicClientCookie("name", "value");
		// new a cookie
		cookie.setDomain("domain");
		cookie.setExpiryDate(new Date());
		// set the properties of the cookie
                cookieStore.addCookie(cookie);
 最后通过按得到addCookie将其加入cookieStore。(如有相同的name的cookie将会覆盖,个人觉得类似hashmap的put操作。)

 

 

六:管理header:

在平常抓取过程中,经常需要在请求中加入许多header伪装成一个正常的浏览器。以免被服务器认出是爬虫而被封。

设置一些常见header:

post.setHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36");
		post.setHeader("Connection", "keep-alive");

注意:下载某些网站的资源时,服务器会获取你的来源站,并发出对应的相应。如果来源站不对,可能会被服务器拒绝。此时只需要在请求中加个header就行。

get1.setHeader("Referer", "http://www.a.com");

  

 

ps:

1、爬虫也要遵守基本法,在多次请求的之中为了不给对方服务器造成负担(避免被封),尽量在请求间sleep一个随机数值。

2、爬取非英文网站时注意编码格式,国内一般为utf-8,也有一些是gb2312.获取时注意转码。

3、多获得一些可靠IP(备胎),一旦自身ip被封,赶快去找备胎。附带一个简单的判断网站是否需要代理方法:

// 判断访问目标网站是否需要代理
	private boolean isNeedProxy() {
		boolean result = true;
		URL url;
		try {
			url = new URL("http://apkpure.com/");
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			connection.setConnectTimeout(6000);
			// int i = connection.getResponseCode();
			int i = connection.getContentLength();
			if (i > 0) {
				result = false;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}

 

2
3
分享到:
评论
1 楼 java-lxm 2015-10-20  
不错,学习了

相关推荐

    httpclient4.5工具包

    HttpClient 4.5支持自动维护Session,这意味着开发者无需手动管理Cookie或其他会话标识,库会自动处理这些细节。这简化了代码,提高了应用的健壮性。 3. **主要组件** HttpClient 4.5的核心组件包括: - `...

    HttpClient4.5源码

    总的来说,HttpClient 4.5源码的研究对于任何希望在Java应用中进行HTTP通信的开发者来说都是一份宝贵的资源,它不仅可以帮助我们理解HTTP协议的实现细节,还能让我们学习到如何优雅地处理网络通信中的各种复杂情况。...

    httpClient需要的jar包

    7. **异步编程**:HttpClient 4.5及以上版本引入了AsyncHttpClient,支持异步非阻塞I/O,适用于高并发场景。 8. **Cookie管理**:HttpClient有一个内置的Cookie管理器,可以处理服务器返回的Cookie,并在后续请求中...

    httpclient的入门实例

    - **异步请求**:HttpClient 4.5及以上版本支持异步API,允许并发处理多个请求。 在实际应用中,HttpClient可以与其他工具或框架结合使用,如Spring框架,以简化HTTP客户端的集成和管理。 总之,HttpClient是Java...

    httpclient-4.1.2.jar

    不过,需要注意的是,随着技术的发展,HttpClient的后续版本可能会提供更多的特性或修复一些已知问题,因此在新项目中,可能需要考虑使用更现代的版本,如HttpClient 4.5.x或更高版本,以获取更好的性能和兼容性。

    httpclient需要的jar包

    这个版本可能已经过时,因为最新版本是HTTPClient 4.5.x或更高版本,但理解旧版本的使用仍然是有价值的,特别是对于仍在使用旧代码库或有特定兼容性需求的项目。 为了使用HTTPClient-4.3.1,你需要将以下jar包添加...

    httpclient

    Apache Commons HttpClient是HttpClient早期版本的一个扩展,提供了一些额外的功能和便利,但随着HttpClient库的发展,这部分内容已经被集成到主项目中。如果你看到"commons-httpclient"这个文件,可能指的是...

    httpclient-4.3.1.jar httpcore-4.4.13.jar commons-logging-1.2.jar

    HttpClient 4.5.x 是4.3.x的一个后续版本,它引入了更多改进和新特性: 1. **更全面的HTTP/2支持**:增加了对HTTP/2推送、流量控制和优先级框架的支持。 2. **TLS增强**:提供了更多的SSL/TLS配置选项,包括对现代...

    HttpClient 4.4英文版文档

    文档涵盖了此版本中实现的功能和API的使用细节。 ### 1. HttpClient基础 #### 1.1 请求执行 - **HTTP请求**:HttpClient用于构建和发送HTTP请求。 - **HTTP响应**:描述了对来自服务器的响应的处理,包括读取状态...

    httpclient4中文文档

    **4.5 凭据提供器** - 如何提供和管理用户凭据。 **4.6 HTTP认证和执行上下文** - HTTP认证与请求执行上下文的关系。 **4.7 抢占认证** - 在发送请求之前预先发送认证信息。 **4.8 NTLM认证** - 特别介绍了...

    httpclient-tutorial-simplified-chinese

    **6.1 自定义客户端连接**:允许开发者自定义连接的细节。 **6.2 有状态的 HTTP 连接** - **用户令牌处理器**:处理用户的令牌。 - **用户令牌和执行上下文**:描述了如何在执行上下文中管理用户令牌。 通过以上...

    httpcomponents

    3. 异步编程:HttpClient 4.5引入了异步客户端,通过Future和Callback接口,使得非阻塞的HTTP操作成为可能,适合处理高并发场景。 三、HttpCore模块 HttpCore是HttpClient的基础,提供了HTTP协议的基本传输功能。...

    httpcore.zip

    HttpClient 4.5.x版本引入了许多改进,如支持HTTP/2协议,增强了线程安全性和并发性,优化了内存使用,以及对Java 8的兼容性,使其成为企业级应用的理想选择。 再者,`jettison-1.0.jar`是用于JSON(JavaScript ...

    C#中HttpWebRequest、WebClient、HttpClient的使用详解

    最后是HttpClient,它是.NET Framework 4.5及更高版本中引入的新类,相比前两者,HttpClient设计得更现代,更面向异步编程,并且性能更好。HttpClient提供了更直观的API,更易于理解和使用。以下为HttpClient的POST...

    .NET HTTP 请求服务接口

    HttpClient是.NET Framework 4.5及更高版本引入的类,它提供了更简洁、更直观的API来发送HTTP请求。HttpClient不仅易于使用,而且支持异步操作,更适合现代的多线程和高并发环境。HttpClient的核心方法包括GetAsync...

    HTTP CLIENT TUTORIAL

    接下来,我们将详细解释文档中提到的一些关键知识点: ### 1. HttpClient的基础 1.1. 请求执行 - **HTTP请求**: HttpClient允许构建和执行HTTP请求,包括GET、POST、PUT、DELETE等。 - **HTTP响应**: 它能够接收...

    基于C#的HTTP通信协议

    1. **HttpClient**:HttpClient是C# 4.5引入的一个强大工具,用于发起HTTP请求。你可以使用它来GET、POST、PUT、DELETE等方法与服务器交互。例如,要发送一个GET请求,你可以创建一个HttpClient实例,设置请求头,...

    dotnet 6 HttpClientHandler 和 SocketsHttpHandler 有什么差别.rar

    HttpClientHandler是较早的处理程序,它在.NET Framework 4.5中引入,作为HttpClient的主要处理者。它的设计目标是提供一个易用且功能全面的HTTP客户端,支持各种特性如重定向、自动处理Cookie、身份验证等。然而,...

    http-daima.rar_HTTP_c# http

    - `HttpClient` 类:自.NET Framework 4.5起引入,更现代、更易于使用的HTTP客户端。它提供异步操作,性能更好,更易于管理连接。 3. 使用HttpWebRequest进行HTTP请求: - 创建实例:`HttpWebRequest request = ...

    C# winform上传照片到服务器

    可以使用HttpClient类,它是.NET Framework 4.5及更高版本中的一个强大工具。以下是一个基本的文件上传示例: ```csharp using (var client = new HttpClient()) { using (var content = new ...

Global site tag (gtag.js) - Google Analytics