httpmime-4.1.3 简单使用

转载自:http://blog.csdn.net/eddysong9280/article/details/9923391

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议(CV大法来自于HttpClient百度百科,-  -),httpclient的jar包可去apache官网或者csdn或者iask下载(个人感觉iask还是不错的,至少好多资源免积分,而且里面还有很多意想不到的资源哦, -  -)。

言归正传,介绍项目中使用的httpmime-4.1.3.jar包使用,理解jar包里面的类定义及属性方法可参照其javadoc,下面直接上代码。

[java]  view plain copy
  1. public class HttpworkTask extends Thread {  
  2.     public final static String TAG = "HttpworkTask"//log tag  
  3.     private NetworkListener listener;  
  4.     private static HttpClient httpClient;  
  5.     private final static int CONNECTIONTIMEOUT = 10000;//http链接超时  
  6.     private final static int REQUESTTIMEOUT = 20000;//http数据请求超时  
  7.       
  8.       
  9.     private String url = null;  
  10.     private Map<String, Object> paras = null;//post的StringBody  
  11.     private Map<String, File> fileParas = null;//post的FileBody  
  12.   
  13.     public HttpworkTask(String url, Map<String, Object> paras, Map<String, File> fileParas){  
  14.         this.url = url;  
  15.         this.paras = paras;  
  16.         this.fileParas = fileParas;  
  17.     }  
  18.       
  19.     @Override  
  20.     public void run() {  
  21.           
  22.         BufferedReader br = null;  
  23.         StringBuilder sBuilder = new StringBuilder();  
  24.         HttpParams httpParams = new BasicHttpParams();  
  25.         HttpConnectionParams.setConnectionTimeout(httpParams, CONNECTIONTIMEOUT);  
  26.         HttpConnectionParams.setSoTimeout(httpParams, REQUESTTIMEOUT);  
  27.           
  28.         SchemeRegistry registry = new SchemeRegistry();    
  29.         registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));    
  30.         registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));  
[java]  view plain copy
  1.         //由于是使用线程操作http,所以设置Thread safe属性,不然当start多个httpworktask线程时必然报错,这点需要注意    
  2.         httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager(httpParams, registry), httpParams);      HttpPost post = new HttpPost(url);  
  3.         //添加 post的String 和File数据  
  4.         MultipartEntity entity = new MultipartEntity();  
  5.         try {  
  6.             // 添加参数  
  7.             if (paras != null && !paras.isEmpty()) {  
  8.                 for (Map.Entry<String, Object> item : paras.entrySet()) {  
  9.                     entity.addPart(item.getKey(), new StringBody(item.getValue().toString(), Charset.forName("UTF-8")));  
  10.                 }  
  11.             }  
  12.   
  13.             // 添加文件  
  14.             if (fileParas != null && !fileParas.isEmpty()) {  
  15.                 for (Map.Entry<String, File> item : fileParas.entrySet()) {  
  16.                     if (item.getValue().exists()) {  
  17.                         Log.i(TAG, "upload File is exists and filepath is-->" + item.getKey() + "  " + item.getValue().getPath());  
  18.                         entity.addPart(item.getKey(), new FileBody(item.getValue()));  
  19.                     }else{  
  20.                         Log.e(TAG, "upload File is NOT exists!");  
  21.                     }  
  22.                       
  23.                 }  
  24.             }  
  25.             post.setEntity(entity);  
  26.   
  27.             HttpResponse response = httpClient.execute(post);  
  28.   
  29.             int statecode = response.getStatusLine().getStatusCode();  
  30.   
  31.             Log.i(TAG, "http response code-->" + statecode);  
  32.   
  33.             if (statecode == HttpStatus.SC_OK) {  
  34.                 HttpEntity responseEntity = response.getEntity();  
  35.                 if (responseEntity != null) {  
  36.                     InputStream is = responseEntity.getContent();  
  37.                     br = new BufferedReader(new InputStreamReader(is));  
  38.                     String tempStr;  
  39.                     while ((tempStr = br.readLine()) != null) {  
  40.                         sBuilder.append(tempStr);  
  41.                     }  
  42.                     br.close();  
  43.                 }  
  44.             }  
  45.         } catch (Exception e) {  
  46.                         listener.onConnectionError(NetworkListener.NET_ERROR, "http connect is error,pls check your phone network");  
  47.         } finally {  
  48.             if (br != null) {  
  49.                 try {  
  50.                     br.close();  
  51.                 } catch (IOException e) {  
  52.                     e.printStackTrace();  
  53.                 }  
  54.             }  
  55.         }  
  56.         post.abort();  
  57.         //http返回的数据  
  58.         String resData = sBuilder.toString();  
  59.         Log.i(TAG, "http server response -->" + resData);  
  60.         if (resData != null) {  
  61.             listener.onConnectionRecieveData(resData.getBytes(), resData.length());  
  62.         }  
  63.           
  64.           
  65.     }  
  66.   
  67.   
  68.     public static void shutdownHttp() {  
  69.         if (httpClient != null) {  
  70.             httpClient.getConnectionManager().shutdown();  
  71.         }  
  72.     }  
  73. }  
[java]  view plain copy
  1. 说明几点:1.使用MultipartEntity,Stringbody和FileBody可同时post。  
[java]  view plain copy
  1. 2.可同时上传n个File文件。  
[java]  view plain copy
  1. 一般在定义http业务的json协议时,如json上传照片文件,imgUrls:图片文件(同时上传多张图片),entity.addPart的第一个参数为fileParas map的key值应为imgUrls,这样多次addpart后会不会顶掉前面add的filebody呢(key值相同啊)?其实不会!具体可看下addpart函数的实现源码,它是用addpart的两个参数生成一个对象放到一个list中去了。  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值