1. 程式人生 > >httpmime-4.1.3 簡單使用

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,下面直接上程式碼。

  1. publicclass HttpworkTask extends Thread {  
  2.     publicfinalstatic String TAG = "HttpworkTask"//log tag
  3.     private NetworkListener listener;  
  4.     privatestatic HttpClient httpClient;  
  5.     privatefinalstaticint CONNECTIONTIMEOUT = 10000;//http連結超時
  6.     privatefinalstaticint REQUESTTIMEOUT = 20000;//http資料請求超時
  7.     private String url = null;  
  8.     private Map<String, Object> paras = null;//post的StringBody
  9.     private Map<String, File> fileParas = null;//post的FileBody
  10.     public HttpworkTask(String url, Map<String, Object> paras, Map<String, File> fileParas){  
  11.         this.url = url;  
  12.         this.paras = paras;  
  13.         this.fileParas = fileParas;  
  14.     }  
  15.     @Override
  16.     publicvoid run() {  
  17.         BufferedReader br = null;  
  18.         StringBuilder sBuilder = new StringBuilder();  
  19.         HttpParams httpParams = new BasicHttpParams();  
  20.         HttpConnectionParams.setConnectionTimeout(httpParams, CONNECTIONTIMEOUT);  
  21.         HttpConnectionParams.setSoTimeout(httpParams, REQUESTTIMEOUT);  
  22.         SchemeRegistry registry = new SchemeRegistry();    
  23.         registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));    
  24.         registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));  
  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.             if (fileParas != null && !fileParas.isEmpty()) {  
  14.                 for (Map.Entry<String, File> item : fileParas.entrySet()) {  
  15.                     if (item.getValue().exists()) {  
  16.                         Log.i(TAG, "upload File is exists and filepath is-->" + item.getKey() + "  " + item.getValue().getPath());  
  17.                         entity.addPart(item.getKey(), new FileBody(item.getValue()));  
  18.                     }else{  
  19.                         Log.e(TAG, "upload File is NOT exists!");  
  20.                     }  
  21.                 }  
  22.             }  
  23.             post.setEntity(entity);  
  24.             HttpResponse response = httpClient.execute(post);  
  25.             int statecode = response.getStatusLine().getStatusCode();  
  26.             Log.i(TAG, "http response code-->" + statecode);  
  27.             if (statecode == HttpStatus.SC_OK) {  
  28.                 HttpEntity responseEntity = response.getEntity();  
  29.                 if (responseEntity != null) {  
  30.                     InputStream is = responseEntity.getContent();  
  31.                     br = new BufferedReader(new InputStreamReader(is));  
  32.                     String tempStr;  
  33.                     while ((tempStr = br.readLine()) != null) {  
  34.                         sBuilder.append(tempStr);  
  35.                     }  
  36.                     br.close();  
  37.                 }  
  38.             }  
  39.         } catch (Exception e) {  
  40.                         listener.onConnectionError(NetworkListener.NET_ERROR, "http connect is error,pls check your phone network");  
  41.         } finally {  
  42.             if (br != null) {  
  43.                 try {  
  44.                     br.close();  
  45.                 } catch (IOException e) {  
  46.                     e.printStackTrace();  
  47.                 }  
  48.             }  
  49.         }  
  50.         post.abort();  
  51.         //http返回的資料
  52.         String resData = sBuilder.toString();  
  53.         Log.i(TAG, "http server response -->" + resData);  
  54.         if (resData != null) {  
  55.             listener.onConnectionRecieveData(resData.getBytes(), resData.length());  
  56.         }  
  57.     }  
  58.     publicstaticvoid shutdownHttp() {  
  59.         if (httpClient != null) {  
  60.             httpClient.getConnectionManager().shutdown();  
  61.         }  
  62.     }  
  63. }  
  1. 說明幾點:1.使用MultipartEntity,Stringbody和FileBody可同時post。  
  1. 2.可同時上傳n個File檔案。  
  1. 一般在定義http業務的json協議時,如json上傳照片檔案,imgUrls:圖片檔案(同時上傳多張圖片),entity.addPart的第一個引數為fileParas map的key值應為imgUrls,這樣多次addpart後會不會頂掉前面add的filebody呢(key值相同啊)?其實不會!具體可看下addpart函式的實現原始碼,它是用addpart的兩個引數生成一個物件放到一個list中去了。