【轉】 Pro Android學習筆記(六九):HTTP服務(3):HTTP POST MultiPart

目錄(?)[-]html

  1. 創建測試環境
  2. 開發環境導入第三方JAR
  3. HTTP Post Multipart小例子

HTTP POST不只能夠經過鍵值對傳遞參數,還能夠攜帶更爲複雜的參數,例如文件。HTTP Post支持攜帶body,content-type爲multipart。本次咱們將嘗試經過http post上傳一個小文件。web

創建測試環境

上傳文件的測試環境很難找,下載了Tomcat,想裝一個環境,打開後,發現忘得也差很少,要看幫助,比較麻煩,下面是我上傳文件到189網盤抓的包,上傳一個圖片文件,整個content長度爲39K。網盤很難做爲測試環境的緣由是,咱們必須完成登陸等一系列操做。咱們只是須要驗證一下小例子,能夠簡單經過抓包來判斷,預計web server會返回4xx或5xx的錯誤,但這不影響咱們的實驗。apache

開發環境:導入第三方JAR

可是目前Andriod的HttpClient並不直接支持multipart,咱們須要三個額外的jar來支持:Apache Commons IO,Mime4j,以及HttpMime。能夠經過下面地址來下載,也會附到咱們所提供的小例子源代碼中。http://commons.apache.org/proper/commons-io/http://james.apache.org/mime4j/,以及http://hc.apache.org/index.html。這些jar要最終打包在apk中,應用才能在設備中運行。tomcat

在之前的ADT版本中,能夠在相應的Project按右鍵,參見Android學習筆記(四四):第三方Java庫的使用。選擇Properties,進去後選擇Java Build Path,而後選擇Libaraies,點擊Add External JARs就添加。可是在最新的版本中,採用這種方式在編譯中正常,在運行時會報NoClassDefFoundError,以下。工具

緣由是,這些Jar包並無真正打入apk中。在新的ADT,咱們直接將相應的jar包拷貝到project下面的libs/的目錄,而後在Eclipse中點擊libs/,按右鍵,選擇刷新便可。咱們在libs/和Android Private Libraries/中均可以看到相應的jar,以下圖所示:post

若是咱們導入的是最新httpmime-4.3.1.jar,須要將httpcore-4.3.jar同時導入,在接下來的代碼編寫使用到InputStreamBody數據類型,InputStreamBody會使用到httpcore的類,否者運行時會報org.apache.http.entity.ContentType cannot be resolved的錯誤。學習

HTTP Post Multipart小例子

HTTP Post Multipart也是HTTP Post的例子,和以前的小例子相比,只是設置HTTP參數不一樣,本例子將設置multipart參數。下面截去例子中的部分,如何讀response與以前的相同,再也不重複。測試

private HttpResponse multiPartTest() throws Exception{  
    try{              
        HttpClient client = new DefaultHttpClient(); 
        HttpPost request = new HttpPost("http://upload.cloud.189.cn/v5/v5webUploadSmallFileActionl"); 
             
        //設置HTTP參數,本例設置Multipart參數 
        //(1)上傳文件readme.txt已經放在asset/下,獲取該文件的ContentBody。若是是在存貯中某個目錄下,能夠用FileBody fb = new FileBody(File f)來獲得該ContentBody。
        InputStream is = this.getAssets().open("readme.txt");  
        byte[] data = IOUtils.toByteArray(is);                
        InputStreamBody isb = new InputStreamBody(new ByteArrayInputStream(data), "myUpload");               
        //(2)除了文件外,咱們再附加兩個參數,生成這兩個參數的ContentBody
        StringBody sb1 = new StringBody("some text goes here");  
        StringBody sb2 = new StringBody("some text goes here, too");  
       //(3)做爲multipart參數,加入到request中 
        MultipartEntity multiEntity = new MultipartEntity();  
        multiEntity.addPart("myUpload", isb);     
        multiEntity.addPart("one",sb1);  
        multiEntity.addPart("two",sb2);               
        request.setEntity(multiEntity);  
//在上個例子中setEntity()裏的參數是UrlEncodedFormEntity本次是MultiPartEntity
               
        return client.execute(request);               
    }catch(Exception e){  
        throw e;  
    }  
}ui

回頭說說調測環境,咱們在網上找來一個http server,本例是189網盤,向其發送http post multipart請求,因爲咱們沒有進行網盤用戶登陸的過程,而參數也非189所指定,所以收到到404消息的reponse。但咱們能夠經過抓包工具來查看各參數的填入狀況,來了解如何在Android中填構multipart。本例咱們在multipart entity中加了三個參數,讓咱們看看request包。this

若是咱們在機器上狀態tomcat apache來搭建測試環境,須要注意的是在模擬器中不能使用127.0.0.1來指向機器的tomcat server,那會指向模擬器自己,要使用網卡的地址。

本博文涉及的例子代碼,能夠在Pro Android學習:Http service小例子中下載。

相關連接: 個人Android開發相關文章

相關文章
相關標籤/搜索