androidentity什么用_AndroidHttpClient和HttpEntity详解

AndroidHttpClient结构:

public final classAndroidHttpClientextendsObjectimplements 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(URIuri)

——HttpGet(Stringuri)

看上面的最后两个构造方法,你应该能猜到那个参数的意义了,就是想要

获取文件的地址!其实第一个虽然没有提供一个地址,但是HttpGet有个

方法可以设置资源地址:HttpGet.setURI(URI uri);

看下他的具体初始化方式:

方式一:

try{final String _URI = "www.baidu.com";

HttpGet requestGet= newHttpGet();

requestGet.setURI(newURI(_URI));

}catch(URISyntaxException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

方式二:

try{final String _URI = "www.baidu.com";

HttpGet requestGet= new HttpGet(newURI(_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(newInputStreamEntity(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(newByteArrayEntity(b));

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

——StringEntity:这个实体还是比较使用的,他能直接将一个字符串封装到实体中,我看过

有人用这个东西去发送图片,就是将图片转成byte,然后在转成Base64编码的数据,再添加到

这个实体中,其实我感觉这个就是放字符串的,就不要将图片什么的,放进来了,毕竟还有专门

放文件的实体呢对吧?

try{//创建一个字符串

String str = "Hello world";

mEntitys.add(newStringEntity(str));

}catch(UnsupportedEncodingException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

——UrlEncodedFormEntity:将请求的内容进行格式化了,其实这个方法同时简化的客户端发送,

也简化了服务器端获取,服务器通过getParameters(String name)即可获取到传送来的信息。

方便的原因是将发送的信息键值对化了,键值对,你懂得,就是一个Key对应一个Value呗,所以客户端

需要创建一个键值对对象即:NameValuePair。而UrlEncodedFormEntity为了一次能发送多个键值对,

参数采用了集合的方式:List。

/*** 服务器端,只需要使用getParameters(String name)即可获得属性值*/

try{//post请求,需要一个K-V集合数组,来保存请求的信息,并将其放去请求实体中

List postParameters = new ArrayList();//添加属性对

postParameters.add(new BasicNameValuePair("name", "android"));

mEntitys.add(newUrlEncodedFormEntity(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包,然后

服务器和客户端一起使用。

packagecom.xhm.Test.Http;importjava.io.Serializable;public class Student implementsSerializable {private static final long serialVersionUID = 1L;privateString name;private intage;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

}

/*** 在使用这个实体的时候要注意,对象的bean所在的包名要是服务器上的一致,否则会有问题。*/

try{//创建对象

Student student = newStudent();

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 = newContentProducer() {

@Overridepublic void writeTo(OutputStream outstream) throwsIOException {//TODO Auto-generated method stub

Writer writer = newOutputStreamWriter(outstream);

writer.write("hello");

writer.write("world");

writer.flush();

writer.close();

}

};

mEntitys.add(new EntityTemplate(producer));

好了上面就是HttpEntity的一些东西,有什么不对的地方,希望批评指正!谢谢。

四:里面使用到的一些方法

1.执行请求和解析反馈的结果

/*** 执行post网络访问

*

*@paramentity

* 请求实体*/

private void executePost(final HttpPost request, finalHttpEntity entity) {try{

request.setEntity(entity);//连接服务器,并获得反馈的response

mResponse =mClient.execute(request);//从反馈的response中获得输入流

BufferedReader mReader = new BufferedReader(newInputStreamReader(

mResponse.getEntity().getContent()));

Message msg= newMessage();

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

*

*@parambr

*@throwsIOException*/

protected StringBuffer BR2SB(BufferedReader br) throwsIOException {

StringBuffer sb= new StringBuffer("");

String line= null;while ((line = br.readLine()) != null) {

sb.append(line+ "\n");

}returnsb;

}

mHandler = new Handler(newCallback() {

@Overridepublic booleanhandleMessage(Message msg) {//TODO Auto-generated method stub

mTextView.setText(msg.obj.toString());return false;

}

});

提示:因为android为了安全在3.0之后不允许将HTTP请求放在主线程中,所以必须使用Thread,所以这里也使用的handler来发送http反馈的信息!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值