AndroidHttpClient和HttpEntity详解

AndroidHttpClient结构:
public final class AndroidHttpClient extends Object
implements HttpClient
前言:这类其实是Google对阿帕奇的HttpClient的一个封装,一些默认属性有android做了一些优化。
然后阿帕奇的HttpClient是对java中HttpUrlConnection的一个封装,感觉阿帕奇封装的还是不错的,
特别是其中的HttpEntity,很强大也很好用,能在android手机上上传百M的文件到服务器,还是不错的。
一:AndroidHttpClient的使用方式
1.创建AndroidHttpClient对象
AndroidHttpClient c = AndroidHttpClient.newInstance("");
AndroidHttpClient只能通过以上方法建立,其中的参数好像是设置代理的,如果没有置空即可。
2.使用开启cookies
AndroidHttpClient默认情况下是关闭cookies的,开启的方法如下
AndroidHttpClient c = AndroidHttpClient.newInstance("");
BasicHttpContext context = new BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE, new BasicCookieStore());
try {
c.execute(null, context);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
其中的context在client发送的请求的时候,同时发送即可。发送请求方法的第一个参数,很重要,下面详解。
二:HttpUriRequest使用
1.上面的c.execute(null, context);第一个参数即为HttpUriRequest,用于封装请求信息的。
HttpUriRequest提供了两个使用的子类,相信你闭着眼睛也能猜到,没错!就是HttpGet和HttpPost。
2.ok,我们先来看看,HttpGet是怎么用的。
题外话,其实从这个方法的名字上就能看出来,get嘛,
就是获取的得到的意思,所以如果你想从服务器获取什么数据,就多用用他吧。
HttpGet提供了三个构造函数:
——HttpGet()
——HttpGet(URI uri)
——HttpGet(String uri)
看上面的最后两个构造方法,你应该能猜到那个参数的意义了,就是想要
获取文件的地址!其实第一个虽然没有提供一个地址,但是HttpGet有个
方法可以设置资源地址:HttpGet.setURI(URI uri);
看下他的具体初始化方式:
方式一:
try {
final String _URI = "www.baidu.com";
HttpGet requestGet = new HttpGet();
requestGet.setURI(new URI(_URI));
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
方式二:
try {
final String _URI = "www.baidu.com";
HttpGet requestGet = new HttpGet(new URI(_URI));
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
方式三:
final String _URI = "www.baidu.com";
HttpGet requestGet = new HttpGet(_URI);
3.好了,当创建好了HttpGet对象之后,就可以将其放入AndroidHttpClient访问了。
有人说使用Get方式访问的时候,能不能在后面添加用户名和密码什么的,其实加不加
都可以,因为在服务器那边获取的方式是一样的,但是我觉得如果有参数的话,还是不要
直接加在资源地址后面吧,因为我感觉太难看了。。。看起来不整洁,哈哈。
那有人说了,那怎么有参数的时候怎么办呢?下面就给你解决的方案,HttpPost闪亮登场!
4.HttpPost这个东西,其实最NB的地方是他能放入一个实体(Entity)发送到服务器,这个
实体能够封装各种数据,将想发送的数据封装到Entity中,然后调用HttpPost的setEntity方法
将实体放入其中,然后发送请求就行了。所以下面就好讲解一下Entity的都能封装什么类型的数据。
HttpPost的初始化方式和HttpGet一样的,就是将HttpGet换成HttpPost就行了。
三:HttpEntity讲解(本博文的重点)
1.有的同学可能会觉得,看博文文字太多看的很是无聊,来张图片多好。既然大家有着要求,那就满足你。

要是觉得图片看着不是清晰,可以将图片拖拽到桌面,慢慢欣赏。
2.上面的图片显示了HttpEntity的大致结构,interface和abstract我就不多说了,
其实也没什么说的,就是定义了一些方法,但是还没实现,等着之后的class来具体实现的,
打个比喻,interface就是项目经理,class就是咱们这些**了,所以还是来说说我们吧。
——InputStreamEntity:他就是将一个IO流封装到实体中,这个东西很NB,经过我的实测,
能发送百M的数据到服务器,而且不是OOM(内存溢出),之前做一个视频拍摄,然后上传的
项目的时候,就遇到过视频上传的时候会有OOM问题,后来用分割上传的方式解决了,但是直
到发现这个方法的时候,发现阿帕奇已经给准备好了,还得多看书啊。
我这里是读取的assets下的一个文件,将其转换为io流,然后放入了实体中。在new这个实体的
时候,需要提供一个int参数,这个参数的数值可以小于或等于IO流的大小,否则会报错,当参数
的数值小于IO的大小时,会截取上传IO,比如IO流的内容是阿拉伯数字 1到10,而参数数值你用了5
那服务器只能接收到1 2 3 4 5.
try {
// 读取assets中的文件将其转换为io流
InputStream is = getActivity().getAssets().open("Text.xml");
mEntitys.add(new InputStreamEntity(is, is.available()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
——ByteArrayEntity:将byte数组封装到实体中,有的时候你可能获取到了一个byte对象,而不是io对象,
所以直接使用这个方法就可以将byte封装到实体中,而不用转换一下。
try {
// 读取assets中的文件将其转换为io流
InputStream is = getActivity().getAssets().open("Text.xml");
// 定义一个字节数组封装io流
byte[] b = new byte[is.available()];
// 将io读入到数组中
is.read(b);
mEntitys.add(new ByteArrayEntity(b));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
——StringEntity:这个实体还是比较使用的,他能直接将一个字符串封装到实体中,我看过
有人用这个东西去发送图片,就是将图片转成byte,然后在转成Base64编码的数据,再添加到
这个实体中,其实我感觉这个就是放字符串的,就不要将图片什么的,放进来了,毕竟还有专门
放文件的实体呢对吧?
try {
// 创建一个字符串
String str = "Hello world";
mEntitys.add(new StringEntity(str));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
——UrlEncodedFormEntity:将请求的内容进行格式化了,其实这个方法同时简化的客户端发送,
也简化了服务器端获取,服务器通过getParameters(String name)即可获取到传送来的信息。
方便的原因是将发送的信息键值对化了,键值对,你懂得,就是一个Key对应一个Value呗,所以客户端
需要创建一个键值对对象即:NameValuePair。而UrlEncodedFormEntity为了一次能发送多个键值对,
参数采用了集合的方式:List<NameValuePair>。
/**
* 服务器端,只需要使用getParameters(String name)即可获得属性值
*/
try {
// post请求,需要一个K-V集合数组,来保存请求的信息,并将其放去请求实体中
List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
// 添加属性对
postParameters.add(new BasicNameValuePair("name", "android"));
mEntitys.add(new UrlEncodedFormEntity(postParameters));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
——SerializableEntity:这个东西JB太强大了,不好意思爆粗口了,因为真的很NB,相信很多朋友在获取服务器,
或是上传东西到服务器的时候,都遇到这样的问题,比如获取用户列表,有很多用户,通常是服务器返回xml或是json,
然后我们再去解析,生成一个JavaBean对象,对吧,然后在创建一个集合将这些对象放进去,很是繁琐,特别是解析的时候,
可是如果你使用SerializableEntity这个实体的时候,你会发现,生活原来如此美好,因为你可以直接将序列化的对象放入实体中,
然后发送,客户端或是服务器可以直接接受这个对象!听明白了吗?你不需要解析什么xml或是json,直接就能获取到这个对象了!
是不是很NB,但是NB需要有前提的,就是你的服务器得是Java的,所以和IOS平台交互的时候,还得需要json什么的。。。。
*有一点一定要注意,使用他的时候,被序列化的对象所在包的包名,服务器和客户端必须一致,必须哦,其实可以做一个jar包,然后
服务器和客户端一起使用。
package com.xhm.Test.Http;
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/**
* 在使用这个实体的时候要注意,对象的bean所在的包名要是服务器上的一致,否则会有问题。
*/
try {
// 创建对象
Student student = new Student();
student.setName("Name");
student.setAge(11);
mEntitys.add(new SerializableEntity(student, true));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
——FileEntity:这个也真心NB,直说吧,我将一个450M的rmvb的电影成功上传的服务器上了,服务器正常打开观看。
妈妈再也不同担心我的OOM问题了。而且这个使用起来还很简单,只要提供文件的路径和文件类型就行了。
/**
* 这个实体,能够封装一些比较大的实体,比如上百M的文件等
*
* 上传的时候,注意本demo没有做进度条,在成功上传之后,会返回上传文件的大小
*/
// 创建文件路径,这个视频是在SD卡中的,大概有50M大小
File file = new File("/sdcard/DCIM/dashipin.mp4");
mEntitys.add(new FileEntity(file, "*/*"));
——EntityTemplate:说实话,这个实体我还不清楚,究竟怎么去使用,或是应用什么场景,反正他有点
特别,因为需要一个ContentProducer对象来初始化。
// 创建ContentProducer对象
ContentProducer producer = new ContentProducer() { @Override
public void writeTo(OutputStream outstream) throws IOException {
// TODO Auto-generated method stub
Writer writer = new OutputStreamWriter(outstream);
writer.write("hello");
writer.write("world");
writer.flush();
writer.close();
}
};
mEntitys.add(new EntityTemplate(producer));
好了上面就是HttpEntity的一些东西,有什么不对的地方,希望批评指正!谢谢。
四:里面使用到的一些方法
1.执行请求和解析反馈的结果
/**
* 执行post网络访问
*
* @param entity
* 请求实体
*/
private void executePost(final HttpPost request, final HttpEntity entity) {
try {
request.setEntity(entity);
// 连接服务器,并获得反馈的response
mResponse = mClient.execute(request);
// 从反馈的response中获得输入流
BufferedReader mReader = new BufferedReader(new InputStreamReader(
mResponse.getEntity().getContent()));
Message msg = new Message();
msg.obj = "UpLoad请求\n" + BR2SB(mReader).toString();
mHandler.sendMessage(msg);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 将BufferedReader转换为StringBuffer
*
* @param br
* @throws IOException
*/
protected StringBuffer BR2SB(BufferedReader br) throws IOException {
StringBuffer sb = new StringBuffer("");
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
return sb;
}
mHandler = new Handler(new Callback() {
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub
mTextView.setText(msg.obj.toString());
return false;
}
});
提示:因为android为了安全在3.0之后不允许将HTTP请求放在主线程中,所以必须使用Thread,所以这里也使用的handler来发送http反馈的信息!
AndroidHttpClient和HttpEntity详解的更多相关文章
- android 的android httpClient详解
AndroidHttpClient结构: public final class AndroidHttpClient extends Object implements HttpClient 前言: 这 ...
- Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作. ...
- Multipart/form-data POST文件上传详解
Multipart/form-data POST文件上传详解 理论 简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form ...
- HttpClient使用详解(转)
HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户 ...
- HTTP和HTTPS详解
http://blog.csdn.net/mingli198611/article/details/8055261/ 转自:http://www.cnblogs.com/ok-lanyan/archi ...
- Multipart/form-data POST文件上传详解(转)
Multipart/form-data POST文件上传详解 理论 简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form ...
- HttpClient使用详解
http://itindex.net/detail/52566-httpclient HttpClient使用详解 标签: httpclient | 发表时间:2015-01-22 12:07 | 作 ...
- StrictMode使用详解
http://hb.qq.com/a/20110914/000054.htm http://www.android100.org/html/201204/25/1097.html http://www ...
- Java进阶(三十二) HttpClient使用详解
Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...
随机推荐
- iOS:App上架流程和支付宝支付流程
App上架大致流程: 1.花99美元在苹果开发中心注册一个开发者账号: 2.登陆开发者账号,进入member Center,即开发者成员中心: 3.选取证书标示符(certificates Ident ...
- 利用github和git命令,将本地项目共享到服务器上
一.步骤 1. 创建项目根目录 mkdir 文件夹名 2. 初始化文件夹 git init 3. 配置用户名和邮箱(第一次配置后,不需要再登录) git config user.name 名字 git ...
- represent states with objects
1. The behavior of objects in the real world is more complex than simply being in one state at a tim ...
- ASP.NET MVC之单元测试分分钟的事
一.为什么要进行单元测试? 大部分开发者都有个习惯(包括本人在内),常常不喜欢去做单元测试.因为我们对自己写的程序总是盲目自信,或者存在侥幸心理每次运行通过后就直接扔给测试组的妹子们了.结果妹子一测, ...
- 基于.NET的轻量级微信SDK
一.前言 特别不喜欢麻烦的一个人,最近碰到了微信开发.下载下来了一些其他人写的微信开发“框架”,但是被恶心到了,实现的太臃肿啦. 最不喜欢的就是把微信返回的xml消息在组装成实体类,所以会比较臃肿,现 ...
- sipp中的action使用方法
最近在做sip服务器的压力测试 场景:当主叫收到200 Ok之后要将Contact 头域中的字段放在ACK消息中的请求行和to头域中发给被叫 查看sipp官网文档就使用action, 在主叫脚本中增加 ...
- C#跨平台物联网通讯框架ServerSuperIO(SSIO)正式开源... 1
今天科技类最大的新闻,莫过于微软宣布.NET开发框架开源计划..NET 开源,集成 Clang 和 LLVM 而且自带 Android 模拟器,这意味着 Visual Studio 这个当下最好没有之 ...
- Oculus rift DK2 新手使用设置
为了获得更好的3D沉浸感体验,降低使用晕眩的可能性,使用DK2前,一定要针对使用者自身对DK2进行正确的设置.下面解释一下配置面板的一些参数和意义: Eye Relief滑竿应该和你的DK2两侧的调节 ...
- 基于Jekyll的博客模板
代码地址如下:http://www.demodashi.com/demo/13147.html 效果 环境配置 环境 Windows 10 Git Bash 安装ruby 下载rubyinstalle ...
- shell脚本与mongo交互
1.mongo提供*.js的方法供linux调用 #!/bin/bash /usr/local/mongodb/bin/mongo hostname/dbname xxx.js xxx.js 内容如下 ...