android的HttpClient简单用法

  1 package com.itaem.net;
  2 
  3 import java.io.IOException;
  4 import java.io.UnsupportedEncodingException;
  5 import java.util.ArrayList;
  6 import java.util.List;
  7 
  8 import org.apache.http.HttpEntity;
  9 import org.apache.http.HttpResponse;
 10 import org.apache.http.HttpStatus;
 11 import org.apache.http.HttpVersion;
 12 import org.apache.http.NameValuePair;
 13 import org.apache.http.client.ClientProtocolException;
 14 import org.apache.http.client.HttpClient;
 15 import org.apache.http.client.entity.UrlEncodedFormEntity;
 16 import org.apache.http.client.methods.HttpPost;
 17 import org.apache.http.conn.ClientConnectionManager;
 18 import org.apache.http.conn.params.ConnManagerParams;
 19 import org.apache.http.conn.scheme.PlainSocketFactory;
 20 import org.apache.http.conn.scheme.Scheme;
 21 import org.apache.http.conn.scheme.SchemeRegistry;
 22 import org.apache.http.conn.ssl.SSLSocketFactory;
 23 import org.apache.http.impl.client.DefaultHttpClient;
 24 import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
 25 import org.apache.http.params.BasicHttpParams;
 26 import org.apache.http.params.HttpConnectionParams;
 27 import org.apache.http.params.HttpParams;
 28 import org.apache.http.params.HttpProtocolParams;
 29 import org.apache.http.protocol.HTTP;
 30 import org.apache.http.util.EntityUtils;
 31 
 32 import android.util.Log;
 33 
 34 public class CustomerHttpClient {
 35     private static final String CHARSET = HTTP.UTF_8;
 36     private static HttpClient customerHttpClient;
 37 
 38     private CustomerHttpClient() {
 39     }
 40 
 41     public static synchronized HttpClient getHttpClient() {
 42         if (null == customerHttpClient) {
 43             HttpParams params = new BasicHttpParams();
 44             // 设置一些基本参数
 45             HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
 46             HttpProtocolParams.setContentCharset(params, CHARSET);
 47             HttpProtocolParams.setUseExpectContinue(params, true);
 48             HttpProtocolParams
 49                     .setUserAgent(
 50                             params,
 51                             "Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "
 52                                     + "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");
 53             // 超时设置
 54             /* 从连接池中取连接的超时时间 */
 55             ConnManagerParams.setTimeout(params, 1000);
 56             /* 连接超时 */
 57             HttpConnectionParams.setConnectionTimeout(params, 2000);
 58             /* 请求超时 */
 59             HttpConnectionParams.setSoTimeout(params, 4000);
 60 
 61             // 设置我们的HttpClient支持HTTP和HTTPS两种模式
 62             SchemeRegistry schReg = new SchemeRegistry();
 63             schReg.register(new Scheme("http", PlainSocketFactory
 64                     .getSocketFactory(), 80));
 65             schReg.register(new Scheme("https", SSLSocketFactory
 66                     .getSocketFactory(), 443));
 67 
 68             // 使用线程安全的连接管理来创建HttpClient
 69             ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
 70                     params, schReg);
 71             customerHttpClient = new DefaultHttpClient(conMgr, params);
 72         }
 73         return customerHttpClient;
 74     }
 75 
 76     private static final String TAG = "CustomerHttpClient";
 77 
 78     public static String post(String url, NameValuePair... params) throws Exception{
 79          
 80             // 编码参数
 81             List<NameValuePair> formparams = new ArrayList<NameValuePair>(); // 请求参数
 82             for (NameValuePair p : params) {
 83                 formparams.add(p);
 84             }
 85             UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams,
 86                     CHARSET);
 87             // 创建POST请求
 88             HttpPost request = new HttpPost(url);
 89             request.setEntity(entity);
 90             // 发送请求
 91             HttpClient client = getHttpClient();
 92             HttpResponse response = client.execute(request);
 93             if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
 94                 throw new RuntimeException("请求失败");
 95             }
 96             HttpEntity resEntity = response.getEntity();
 97             return (resEntity == null) ? null : EntityUtils.toString(resEntity,
 98                     CHARSET);
 99          
100 
101     }
102 
103 }

 

这是我使用的一个HttpClient类,做了单例封装

可以直接使用,一会解析一下

 

为什么需要使用HttpClient?和为什么要做成封装?

HttpClient就好像是一个浏览器一样,里面可以给我们设置好很多东西

如上面提到的编码,缓存,客户端介兆,等

就好像真正的浏览器一样具备很多的属性,服务器就可以根据这些东西知道请求者的身份了

 

而我们每次需要访问网络,都需要新建一个“浏览器”对象,就好像我们打开网页是每打开一个网页就开一个浏览器窗口,而浏览器的属性还要重新设置一遍,这是不是很麻烦?

我们可以通过用单例来解决这问题,而单例的实现可以

public static synchronized HttpClient getHttpClient() {}

来实现,里面只要判断一次对象是否有创建就可以返回对象了。

 

高深一点,讲解用HttpClient上传文件:

 

     HttpPost post = new HttpPost(
       "http://118.244.132.124:8080/myupload/upload.php");
     File file = new File("XX");路径或者对象
     MultipartEntity multipart = new MultipartEntity();   //android的HttpClient没有这个对象,要另外加两个包
     multipart.addPart("name", new StringBody("veikr.com")); //设置字符串格式的值
     multipart.addPart("file", new FileBody(file));//设置文件
     HttpClient client = CustomerHttpClient.getHttpClient();//调用上面的方法返回一个
     post.setEntity(multipart);     //设置post里面的实体
     HttpResponse response = client.execute(post);//这个没有什么好说的
     

而response就是我们要返回的东东。用json或者XMl返回数据是比较好处理de

 

而这个File我们是经常用到的是相册图片,和照相机的照片

我示范一下如何得到相册的图片路径

因为File对象创建的时候需要用到:

 1 @Override
 2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 3         super.onActivityResult(requestCode, resultCode, data);
 4         if (resultCode != RESULT_OK) {
 5             Toast.makeText(this, "返回空的东东", 1).show();
 6             return;
 7         }
 8         Bitmap bm = null;
 9         ContentResolver cc = getContentResolver();
10         if (requestCode == mod) {
11             Uri imguri = data.getData();
12             try {
13                 Toast.makeText(this,
14                         "imguri=" + imguri + "   ab=" + imguri.toString(), 1)
15                         .show();
16                 bm = MediaStore.Images.Media.getBitmap(cc, imguri); // 显得到bitmap图片
17                 String[] proj = { MediaStore.Images.Media.DATA };
18 
19                 // 好像是android多媒体数据库的封装接口,具体的看Android文档
20 
21                 Cursor cursor = managedQuery(imguri, proj, null, null, null);
22 
23                 // 按我个人理解 这个是获得用户选择的图片的索引值
24 
25                 int column_index = cursor
26                         .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
27 
28                 // 将光标移至开头 ,这个很重要,不小心很容易引起越界
29 
30                 cursor.moveToFirst();
31 
32                 // 最后根据索引值获取图片路径
33 
34                 path = cursor.getString(column_index);
35                 Toast.makeText(this, path, 1).show();
36                 bm = BitmapFactory.decodeStream(cc.openInputStream(imguri));
37                 ima.setImageBitmap(bm);
38             } catch (FileNotFoundException e) {
39 
40                 e.printStackTrace();
41             } catch (IOException e) {
42                 // TODO Auto-generated catch block
43                 e.printStackTrace();
44             }
45 
46         }
47     }

好了,大概就是这样,有问题联系:

itaems@163.com

转载于:https://www.cnblogs.com/itaem/archive/2012/11/13/2767366.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值