HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程序需要直接通過 HTTP 協議來訪問網絡資源。
雖然在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能,但是對於大部分應用程序來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議。
一般的情況下我們都是使用Chrome或者其他浏覽器來訪問一個WEB服務器,用來浏覽頁面查看信息或者提交一些數據、文件上傳下載等等。所訪問的這些頁面有的僅僅是一些普通的頁面,有的需要用戶登錄後方可使用,或者需要認證以及是一些通過加密方式傳輸,例如HTTPS。目前我們使用的浏覽器處理這些情況都不會構成問題。但是一旦我們有需求不通過浏覽器來訪問服務器的資源呢?那該怎麼辦呢?
下面以本地客戶端發起文件的上傳、下載為例做個小Demo。HttpClient有兩種形式,一種是org.apache.http下的,一種是org.apache.commons.httpclient.HttpClient。
文件上傳可以使用兩種方式實現,一種是PostMethod方式,一種是HttpPost方式。兩者的處理大同小異。PostMethod是使用FileBody將文件包裝流包裝起來,HttpPost是使用FilePart將文件流包裝起來。在傳遞文件流給服務端的時候,都可以同時傳遞其他的參數。
Adroid 4.0 HttpURLConnection拋異常解決方法 http://www.linuxidc.com/Linux/2013-03/81085.htm
node.js+Android(使用HttpURLConnection和HttpClient)實現文件上傳 http://www.linuxidc.com/Linux/2012-02/53532p2.htm
在Android上用HttpURLConnection獲取網頁內容 http://www.linuxidc.com/Linux/2011-08/41211.htm
將文件封裝到FilePart中,放入Part數組,同時,其他參數可以放入StringPart中,這裡沒有寫,只是單純的將參數以setParameter的方式進行設置。此處的HttpClient是org.apache.commons.httpclient.HttpClient。
1 public void upload(String localFile){ 2 File file = new File(localFile); 3 PostMethod filePost = new PostMethod(URL_STR); 4 HttpClient client = new HttpClient(); 5 6 try { 7 // 通過以下方法可以模擬頁面參數提交 8 filePost.setParameter("userName", userName); 9 filePost.setParameter("passwd", passwd); 10 11 Part[] parts = { new FilePart(file.getName(), file) }; 12 filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams())); 13 14 client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); 15 16 int status = client.executeMethod(filePost); 17 if (status == HttpStatus.SC_OK) { 18 System.out.println("上傳成功"); 19 } else { 20 System.out.println("上傳失敗"); 21 } 22 } catch (Exception ex) { 23 ex.printStackTrace(); 24 } finally { 25 filePost.releaseConnection(); 26 } 27 }
記得搞完之後,要通過releaseConnection釋放連接。
這種方式,與上面類似,只不過變成了FileBody。上面的Part數組在這裡對應HttpEntity。此處的HttpClient是org.apache.http.client.methods下的。
1 public void upload(String localFile){ 2 CloseableHttpClient httpClient = null; 3 CloseableHttpResponse response = null; 4 try { 5 httpClient = HttpClients.createDefault(); 6 7 // 把一個普通參數和文件上傳給下面這個地址 是一個servlet 8 HttpPost httpPost = new HttpPost(URL_STR); 9 10 // 把文件轉換成流對象FileBody 11 FileBody bin = new FileBody(new File(localFile)); 12 13 StringBody userName = new StringBody("Scott", ContentType.create( 14 "text/plain", Consts.UTF_8)); 15 StringBody password = new StringBody("123456", ContentType.create( 16 "text/plain", Consts.UTF_8)); 17 18 HttpEntity reqEntity = MultipartEntityBuilder.create() 19 // 相當於<input type="file" name="file"/> 20 .addPart("file", bin) 21 22 // 相當於<input type="text" name="userName" value=userName> 23 .addPart("userName", userName) 24 .addPart("pass", password) 25 .build(); 26 27 httpPost.setEntity(reqEntity); 28 29 // 發起請求 並返回請求的響應 30 response = httpClient.execute(httpPost); 31 32 System.out.println("The response value of token:" + response.getFirstHeader("token")); 33 34 // 獲取響應對象 35 HttpEntity resEntity = response.getEntity(); 36 if (resEntity != null) { 37 // 打印響應長度 38 System.out.println("Response content length: " + resEntity.getContentLength()); 39 // 打印響應內容 40 System.out.println(EntityUtils.toString(resEntity, Charset.forName("UTF-8"))); 41 } 42 43 // 銷毀 44 EntityUtils.consume(resEntity); 45 }catch (Exception e){ 46 e.printStackTrace(); 47 }finally { 48 try { 49 if(response != null){ 50 response.close(); 51 } 52 } catch (IOException e) { 53 e.printStackTrace(); 54 } 55 56 try { 57 if(httpClient != null){ 58 httpClient.close(); 59 } 60 } catch (IOException e) { 61 e.printStackTrace(); 62 } 63 } 64 }
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-07/104303p2.htm