Apache HttpClient 4.3开发指南(三个例子)

查看原文:http://www.ibloger.net/article/159.html


HttpClient API地址:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/package-summary.html

首次接触HttpClient ,参考其他文章中的介绍说 4.3与其他3.x-4.x版本有些大的改变,参考其他大牛的文章http://my.oschina.net/v5871314/blog/204812写了如下3个示例

package com.httptest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

//java.net.UnknownHostException
public class Test {

	/**
	 * 简单的获取一个HTML页面的内容
	 */
	public static void getHTML() {
		CloseableHttpClient httpClient = null;
		try {
			// httpClient = HttpClients.createDefault(); //生成一个httpclient对象, 同下代码
			httpClient = HttpClientBuilder.create().build();

			HttpGet httpGet = new HttpGet("http://www.baidu.com/");

			// 配置请求的超时设置
			RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(50).setConnectTimeout(50).build(); 
			httpGet.setConfig(config);

			// 配置请求的HEADER部分
			httpGet.addHeader(HttpHeaders.ACCEPT, "application/xml");
			
			HttpResponse response = httpClient.execute(httpGet);
			System.out.println("状态码:" + response.getStatusLine()); // 返回响应状态信息
			
			 // 获取响应消息实体
			HttpEntity entity = response.getEntity();
			
			// 获取响应的所有HEADER部分
			System.out.println(Arrays.toString(response.getAllHeaders()));

			 // 判断响应实体是否为空
			if (entity != null) {
				System.out.println("contentEncoding(内容编码):" + entity.getContentEncoding());
				System.out.println("response content(相应内容):" + EntityUtils.toString(entity, "UTF-8"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭或释放资源
			try {
				httpClient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 下载一个文件到本地
	 */
	public static void downloadFile() {
		CloseableHttpClient httpClient = null;
		InputStream iStream = null;
		FileOutputStream foStream = null;

		try {
			httpClient = HttpClients.createDefault(); // 生成一个httpclient对象
			HttpGet httpGet = new HttpGet("http://ww2.sinaimg.cn/large/9d57a855jw1dqpv9fp4yuj.jpg"); // 传入一张图片的地址

			System.out.println("文件正在下载...");
			HttpResponse response = httpClient.execute(httpGet);
			HttpEntity entity = response.getEntity();

			iStream = entity.getContent();
			File file = new File("d:/cat.jpg"); // 图片对象
			foStream = new FileOutputStream(file);
			int i = -1;
			byte[] tmp = new byte[1024];
			while ((i = iStream.read(tmp)) != -1) {
				foStream.write(tmp, 0, i);
			}
			System.out.println("文件下载完毕...");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				foStream.flush();
				foStream.close();
				iStream.close();
				httpClient.close();
				System.out.println("数据流已关闭....");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * post模拟人人网登陆,人人网的用户名、密码、Action参数可以通过在线人人网页面源代码查看
	 */
	public static void loginRR() {
		String account = "1056856191@qq.com"; // 人人网帐号和密码
		String passWord = "liurenkui";

		CloseableHttpClient httpClient = null; // 生成一个httpclient对象
		HttpPost httpPost = null; // 用于提交登录数据
		HttpGet httpGet = null; // 获得登录后的页面
		String login_success;// 用于构造上面的HttpGet

		httpClient = HttpClients.createDefault();
		httpPost = new HttpPost("http://www.renren.com/PLogin.do"); // 人人网登录action

		try {
			List<NameValuePair> params = new ArrayList<NameValuePair>(); // 封装提交参数
			params.add(new BasicNameValuePair("email", account));
			params.add(new BasicNameValuePair("password", passWord));
			httpPost.setEntity(new UrlEncodedFormEntity(params, Consts.UTF_8)); // 可对参数进行编码

			HttpResponse response = httpClient.execute(httpPost); // POST请求,
																	// 提交登录数据
			System.out.println("response.getAllHeaders(): " + Arrays.toString(response.getAllHeaders()));

			Header locationHeader = response.getFirstHeader("location"); // 获得跳转的页面
			if (locationHeader == null) {
				System.out.println("登录不成功,请稍候再试...");
				return;
			}
			login_success = locationHeader.getValue(); // 登录成功后跳转页面
			System.out.println("登录成功后的挑战网页名称:" + locationHeader.getName() + ", 地址:" + login_success);
			httpGet = new HttpGet(login_success);

			HttpResponse response2 = httpClient.execute(httpGet);
			// 输出登录成功后的页面
			String str = EntityUtils.toString(response2.getEntity());
			System.out.println(str);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			httpPost.abort();
			httpGet.abort();
			try {
				httpClient.close();
				System.out.println("完成登录...");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

	public static void main(String[] args) {
		getHTML();
		// downloadFile();
		// loginRR();
	}

}

打印内容如下示例:


一般并不需要设置很多参数,项目需要即可如下简单配置

	/**
	 * 简单的获取一个HTML页面的内容
	 */
	public static void getHTML() {
		CloseableHttpClient httpClient = null;
		try {
			// httpClient = HttpClients.createDefault(); //生成一个httpclient对象,  同下代码
			httpClient = HttpClientBuilder.create().build();

			HttpGet httpGet = new HttpGet("http://www.baidu.com/");
			HttpResponse response = httpClient.execute(httpGet);
			
			 // 获取响应消息实体
			HttpEntity entity = response.getEntity();

			 // 判断响应实体是否为空
			if (entity != null) {
				System.out.println("response content(相应内容):" + EntityUtils.toString(entity, "UTF-8"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭或释放资源
			try {
				httpClient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


模拟带文件上传的表单提交 http://blog.csdn.net/c_vincente/article/details/17001153

注意:

设置请求的超时验证的2种方式(必须),不然会一直请求下去会造成请求很久无响应  

HttpClient3.X和HttpClient4.X的不同超时设置参考文章:http://blog.csdn.net/xiaokui_wingfly/article/details/42595905

(1)RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(50).setConnectTimeout(50).build();
	httpGet.setConfig(config);
(2)RequestConfig defaultRequestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000)
					  .setConnectionRequestTimeout(5000).setStaleConnectionCheckEnabled(true).build();
        CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();

比如下面的联接异常处理

/**
	 * get方式测试服务器联接 
	 */
	public static void getServerData() {
		CloseableHttpClient httpClient = null;
		try {
			RequestConfig defaultRequestConfig = RequestConfig.custom()
					  .setSocketTimeout(5000).setConnectTimeout(5000)
					  .setConnectionRequestTimeout(5000)
					  .setStaleConnectionCheckEnabled(true).build();
			httpClient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
			
			HttpGet httpGet = new HttpGet("http://172.25.0.119:7015/DCMapService/servlet/ProxyServlet?type=sg_grid&x=507638.3125000&y=303547.9687500");
			HttpResponse response = httpClient.execute(httpGet);
			HttpEntity entity = response.getEntity();
			
			// 判断响应实体是否为空
			if (entity != null) {
				if (entity.toString().trim().equals("")) {
					System.out.println("空");
				}
				System.out.println("server get:" + EntityUtils.toString(entity, "gbk"));
			}
		}catch (NoRouteToHostException e) {
			System.out.println("无网络");
		}catch (ConnectTimeoutException e) {
			System.out.println("远程服务已断开,请稍候尝试");
		}catch (SocketTimeoutException e) {
			System.out.println("请求超时,请稍候尝试");
		}catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {	// 关闭或释放资源
				httpClient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值