HttpClient4 用法 由HttpClient3 升级到 HttpClient4 必看(3)

response = httpclient.execute(httpost);                                              //执行

entity = response.getEntity();                                                            //返回服务器响应

try{

System.out.println("----------------------------------------");

System.out.println(response.getStatusLine());                          //服务器返回状态

Header[] headers = response.getAllHeaders();                    //返回的HTTP头信息

for (int i=0; i<headers.length; i++) {                             

System.out.println(headers[i]);

}

System.out.println("----------------------------------------");

String responseString = null;

if (response.getEntity() != null) {

responseString = EntityUtils.toString(response.getEntity());      / /返回服务器响应的HTML代码

System.out.println(responseString);                                  //打印出服务器响应的HTML代码

}

} finally {

if (entity != null)                         

entity.consumeContent();                                                  // release connection gracefully

}

System.out.println("Login form get: " + response.getStatusLine());

if (entity != null) {

entity.consumeContent();

}

}

}

HttpClient4.0 学习实例 - 页面获取

HttpClient 4.0出来不久,所以网络上面相关的实例教程不多,搜httpclient得到的大部分都是基于原 Commons HttpClient 3.1 (legacy) 包的,官网下载页面:,如果大家看了官网说明就明白httpclient4.0是从原包分支出来独立成包的,以后原来那个包中的httpclient不会再升级,所以以后我们是用httpclient新分支,由于4.0与之前的3.1包结构以及接口等都有较大变化,所以网上搜到的实例大部分都是不适合4.0的,当然,我们可以通过那些实例去琢磨4.0的用法,我也是新手,记录下学习过程方便以后检索

本实例我们来获取抓取网页编码,内容等信息

默认情况下,服务器端会根据客户端的请求头信息来返回服务器支持的编码,像google.cn他本身支持utf-8,gb2312等编码,所以如果你在头部中不指定任何头部信息的话他默认会返回gb2312编码,而如果我们在浏览器中直接访问google.cn,通过httplook,或者firefox 的firebug插件查看返回头部信息的话会发现他返回的是UTF-8编码

下面我们还是看实例来解说吧,注释等我也放代码里面解释,放完整代码,方便新手理解

本实例将

使用的httpclient相关包

httpclient-4.0.jar

httpcore-4.0.1.jar

httpmime-4.0.jar

commons-logging-1.0.4.jar等其它相关包

// HttpClientTest.java

package com.baihuo.crawler.test;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import org.apache.http.Header;

import org.apache.http.HttpEntity;

import org.apache.http.HttpHost;

import org.apache.http.HttpResponse;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

class HttpClientTest {

public final static void main(String[] args) throws Exception {

// 初始化,此处构造函数就与3.1中不同

HttpClient httpclient = new DefaultHttpClient();

HttpHost targetHost = new HttpHost("www.google.cn");

//HttpGet httpget = new HttpGet("http://www.apache.org/");

HttpGet httpget = new HttpGet("/");

// 查看默认request头部信息

System.out.println("Accept-Charset:" + httpget.getFirstHeader("Accept-Charset"));

// 以下这条如果不加会发现无论你设置Accept-Charset为gbk还是utf-8,他都会默认返回gb2312(本例针对google.cn来说)

httpget.setHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2)");

// 用逗号分隔显示可以同时接受多种编码

httpget.setHeader("Accept-Language", "zh-cn,zh;q=0.5");

httpget.setHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");

// 验证头部信息设置生效

System.out.println("Accept-Charset:" + httpget.getFirstHeader("Accept-Charset").getValue());

// Execute HTTP request

System.out.println("executing request " + httpget.getURI());

HttpResponse response = httpclient.execute(targetHost, httpget);

//HttpResponse response = httpclient.execute(httpget);

System.out.println("----------------------------------------");

System.out.println("Location: " + response.getLastHeader("Location"));

System.out.println(response.getStatusLine().getStatusCode());

System.out.println(response.getLastHeader("Content-Type"));

System.out.println(response.getLastHeader("Content-Length"));

System.out.println("----------------------------------------");

// 判断页面返回状态判断是否进行转向抓取新链接

int statusCode = response.getStatusLine().getStatusCode();

if ((statusCode == HttpStatus.SC_MOVED_PERMANENTLY) ||

(statusCode == HttpStatus.SC_MOVED_TEMPORARILY) ||

(statusCode == HttpStatus.SC_SEE_OTHER) ||

(statusCode == HttpStatus.SC_TEMPORARY_REDIRECT)) {

// 此处重定向处理  此处还未验证

String newUri = response.getLastHeader("Location").getValue();

httpclient = new DefaultHttpClient();

httpget = new HttpGet(newUri);

response = httpclient.execute(httpget);

}

// Get hold of the response entity

HttpEntity entity = response.getEntity();

// 查看所有返回头部信息

Header headers[] = response.getAllHeaders();

int ii = 0;

while (ii < headers.length) {

System.out.println(headers[ii].getName() + ": " + headers[ii].getValue());

++ii;

}

// If the response does not enclose an entity, there is no need

// to bother about connection release

if (entity != null) {

// 将源码流保存在一个byte数组当中,因为可能需要两次用到该流,

byte[] bytes = EntityUtils.toByteArray(entity);

String charSet = "";

// 如果头部Content-Type中包含了编码信息,那么我们可以直接在此处获取

charSet = EntityUtils.getContentCharSet(entity);

System.out.println("In header: " + charSet);

// 如果头部中没有,那么我们需要 查看页面源码,这个方法虽然不能说完全正确,因为有些粗糙的网页编码者没有在页面中写头部编码信息

if (charSet == "") {

regEx="(?=<meta).*?(?<=charset=[\\'|\\\"]?)([[a-z]|[A-Z]|[0-9]|-]*)";

p=Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);

m=p.matcher(new String(bytes));  // 默认编码转成字符串,因为我们的匹配中无中文,所以串中可能的乱码对我们没有影响

result=m.find();

if (m.groupCount() == 1) {

charSet = m.group(1);

} else {

charSet = "";

}

}

System.out.println("Last get: " + charSet);

// 至此,我们可以将原byte数组按照正常编码专成字符串输出(如果找到了编码的话)

System.out.println("Encoding string is: " + new String(bytes, charSet));

}

httpclient.getConnectionManager().shutdown();       

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/3fbd9af29ca2b245686edfc691f74b17.html