一起学android之Apache接口(17)

Apache HttpClient是一个开源项目,为客户端的HTTP编程提供高效、最新、功能丰富的工具包支持。

在Apache HttpClient库中,我们常用的对网络连接有用的包主要有以下几类:

-org.apache.http.HttpResponse

-org.apache.http.client.HttpClient

-org.apache.http.client.methods.HttpGet

-org.apache.http.impl.client.DefaulfHttpClient

HttpClient httpclient=new DefaultHttpClient();

如果是从服务器检索信息,需要使用HttpGet类的构造器,例如以下代码:

<span style="font-size:18px;">HttpGet request=new HttpGet("http://google.com");</span>

然后用HttpClient类的execut()方法中的HttpGet对象来检索HttpResponse对象,例如下面代码:

<span style="font-size:18px;">HttpResponse response=client.execute(request);</span>

最后读取已检索的响应,例如下面代码:

<span style="font-size:18px;">BufferedReader rd = new BufferedReader(new InputStreamReader(response
				.getEntity().getContent()));
		String line="";
		while ((line=rd.readLine())!=null) {
			System.out.println(line);
		}</span>

在Android系统中,可以采用HttpPost和HttpGet来封装Post请求和Get请求,然后使用HttpClient的execut()方法发送Post或者Get请求并返回服务器的响应数据。

Apache连网的基本流程如下:

1、设置连接和读取超时时间,并新建HttpClient对象,例如下面代码:

<span style="font-size:18px;">HttpParams httpParames=new BasicHttpParams();
		HttpConnectionParams.setConnectionTimeout(httpParames, 2000);
		HttpConnectionParams.setSoTimeout(httpParames, 2000);
		HttpClient httpClient=new DefaultHttpClient(httpParames);</span>

2、实现Get请求,例如下面代码:

<span style="font-size:18px;">HttpGet get = new HttpGet(uri);
		if (headers != null) {
			Set<String> setHead = headers.keySet();
			Iterator<String> iteratorHead = setHead.iterator();
			while (iteratorHead.hasNext()) {
				String headerName = iteratorHead.next();
				String headerValue = (String) headers.get(headerName);
				get.setHeader(headerName, headerValue);
			}

		}
		response = httpClient.execute(get);</span>

3、实现Post发送请求处理,例如下面代码:

<span style="font-size:18px;">HttpPost post = new HttpPost(uri);
		Set<String> setHead = headers.keySet();
		Iterator<String> iteratorHead = setHead.iterator();
		while (iteratorHead.hasNext()) {
			String headName = iteratorHead.next();
			String headValue = (String) headers.get(headName);
			post.setHeader(headName, headValue);
		}

		ContentProducer cp = new ContentProducer() {

			@Override
			public void writeTo(OutputStream outstream) throws IOException {
				Writer writer = new OutputStreamWriter(outstream, "UTF-8");
				writer.write(requestBody);
				writer.flush();
				writer.close();
			}
		};
		HttpEntity entity = new EntityTemplate(cp);
		post.setEntity(entity);
		response = httpClient.execute(post);</span>

通常的Http实体需要在执行上下文的时候动态生成的。HttpClient的提供使用EntityTemplate实体类和ContentProducer接口支持动态实体。ContentProducer中是通过写需求的内容到一个输出流,每次请求的时候都会产生。因此,通过EntityTemplate创建实体通常是独立的,重复性好。

4、通过Response响应请求,例如下面代码:

<span style="font-size:18px;">if(response.getStatusLine().getStatusCode()==200){
			byte[] result=EntityUtils.toByteArray(response.getEntity());
			if(result!=null){
				String str=new String(result,"UTF-8");
			}
		}</span>

上面这段代码如果直接调用toString()方法,可能会导致某些中文字符出现乱码的情况,所以使用toByteArray()方法,如果需要转换成String对象,可以先调用EntityUtils.toByteArray()方法,将消息实体转成byte的数组,再由new String[byte[] bArray]转换成字符串。

以上几个步骤就实现了连网处理数据交互。

Apache的核心功能是HttpClient,通过下面几行代码就能发出一个简单的Get请求并打印响应结果:

<span style="font-size:18px;">try {
			//创建一个默认的HttpClient
			HttpClient httpClient=new DefaultHttpClient();
			//创建一个Get请求
			HttpGet request=new HttpGet(uri);
			//发送Get请求,并响应内容转换成字符串
			String response=httpClient.execute(request,new BasicResponseHandler());
		} catch (Exception e) {
			e.printStackTrace();
		}</span>

如果同时有多个请求需要处理时,我们可以使用多线程,HttpClient提供了创建线程安全对象的API,例如下面代码:

<span style="font-size:18px;">private static final String CHARSET=HTTP.UTF_8;
	private static HttpClient httpClient;
	private HttpTest(){
	}
	public static synchronized HttpClient getHttpClient(){
		if(null==httpClient){
			HttpParams params=new BasicHttpParams();
			//设置参数
			HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
			HttpProtocolParams.setContentCharset(params, CHARSET);
			HttpProtocolParams.setUseExpectContinue(params, true);
			HttpProtocolParams.setUserAgent(params, "Mozilla/5.0(Linux,U;Android 4.0;en-us;.....)");
			//从连接池中取连接的超时时间
			ConnManagerParams.setTimeout(params, 2000);
			//连接超时
			HttpConnectionParams.setConnectionTimeout(params,2000);
			//请求超时
			HttpConnectionParams.setSoTimeout(params, 2000);
			//设置HttpClient支持HTTP和HTTPS两种模式
			SchemeRegistry sr=new SchemeRegistry();
			sr.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
			sr.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 440));
			//使用线程安全的连接管理来创建HttpClient
			ClientConnectionManager ccm=new ThreadSafeClientConnManager(params, sr);
			httpClient=new DefaultHttpClient(ccm,params);

		}
		return httpClient;
	}</span>

在上面代码中,使用ThreadSafeClientConnManager 来创建线程安全的HttpClent。

转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/42836319 情绪控_

时间: 2024-10-05 09:48:31

一起学android之Apache接口(17)的相关文章

Android网络编程之Apache接口

一,通过Apache接口访问网络所必须的类 HttpClient 概述 ---HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议.(摘自百度百科) 成员变量 构造方法 ---DefaultHttpClient() 普通方法 ---execute()//发送请求,需要一个表示请求方法的对象作为参数,返回一个封装了响应信息的HttpResponse对

支持APP手机应用(android和ios)接口调用 ,传输验证可用 shiro 的 MD5、SHA 等加密

请认准本正版代码,售后技术有保障,代码有持续更新.(盗版可耻,违者必究)         此为本公司团队开发 ------------------------------------------------------------------------------------------------------------------------- 1. 有 oracle .msyql.spring3.0.spring4.0  一共 4 套版本全部提供没有打jar没有加密的源代码(最下面截图2

菜鸟学Android编程——简单计算器《一》

菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少,加减乘除就可以. 第一步:设计布局文件 界面如下图: 由于刚开始学Android,对布局文件也不是很了解,边查边找,最后凑合着写好了布局文件. 注意事项:此布局文件用到了GridLayout布局,是在Android4.0以上才出现的(不知道谷歌有没有开发相应的包来适配4.0以下版本). 有关Gri

Android开发学习之路-该怎么学Android(Service和Activity通信为例)

在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通过记忆而不是理解 ② 当某些原理稍微复杂的时候,通过讲解是不能直接理解的,有时候下课回去了再看也不一定看得明白 ③ 对英语文档不够重视,有问题先百度 本鸟自学Android一年,慢慢也学习到了很多的方法,如果你也是一个入门不久但是觉得很多东西都不明白的新手,希望本文对你有帮助. 我觉得要想学好And

一起学android之HTTP预备知识(16)

在Android系统中,提供了下面三种通信接口: 1.标准Java接口:java.net. 2.Apache接口:org.apache.http. 3.Android网络接口:android.net.http. 为了访问网络,需要设置应用程序获取android.permission.INTERNET权限的许可在Android系统中. 以下便是与网络连接相关的包: 1.java.net 该包提供联网相关的类,包括流和数据报套接字.互联网协议以及通用的HTTP处理. 2.java.io 包中的各种类

学Android开发 这19个开发工具助你顺风顺水

学Android开发 这19个开发工具助你顺风顺水 要想快速开发一个Android应用,通常会用到很多工具,巧妙利用这些工具,能让我们的开发工作事半功倍,节省大量时间,下面大连Android开发培训小编就为大家介绍下这19个开发工具都有神马用途. 1.XAppDbg XAppDbg是一个可以在运行中改变代码中参数的一个应用开发工具.这个工具可以为你省下大量的时间,因为你不用为应用的每次小改变而重新编译运行你的程序. 2.ChkBugReport 这个工具可以快速地检查输出的Android错误报告

从零开始学android&lt;ImageSwitcher图片切换组件.二十六.&gt;

ImageSwitcher组件的主要功能是完成图片的切换显示,例如用户在进行图片浏览的时候,可以通过按钮点击一张张的切换显示的图片,而且使用ImageSwitcher组件在每次切换的时候也可以为其增加一些动画的效果,此类定义如下: java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.FrameLayout ? android.widget.ViewAnimator ? android.wid

刘备学Android目录

准备篇-刘备,从编草鞋到编代码...1 第1回     哦,何为Android?... 1 1.1. Android基本知识...1 1.1.1. Android的历史...2 1.1.2. Android的未来...3 1.1.3. 推动Android普及的因素...4 1.2. Android的架构及特性...5 1.2.1. Android 平台架构简介...5 1.2.2. Android特性...8 1.3. 玄德有话说...9 第2回     让我看看说明书!... 9 2.1. A

处女男学Android(十)---Fragment完结篇之Fragment通信和ListFragment

一.前言 前两篇blog介绍了fragment的基本用法 1.Fragment API简介:如FragmentManager.FragmentTransaction等. 2.定义方式:继承Fragment类并重写onCreat.onCreatView.onPause等. 3.引用方式:通过定义<fragment>标签或者通过FragmentTrasaction实例的add()动态添加Fragment这两种. 4.Fragment回退栈与Fragment生命周期. 关于Fragment剩余的重要