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 }
好了,大概就是这样,有问题联系: