Android系統中主要提供了兩種方式來進行HTTP通訊,HttpURLConnection和HttpClient,幾乎在任何項目的代碼中咱們都能看到這兩個類的身影,使用率很是高。java
不過HttpURLConnection和HttpClient的用法仍是稍微有些複雜的,若是不進行適當封裝的話,很容易就會寫出很多重複代碼。因而乎,一些Android網絡通訊框架也就應運而生,好比說AsyncHttpClient,它把HTTP全部的通訊細節所有封裝在了內部,咱們只須要簡單調用幾行代碼就能夠完成通訊操做了。再好比Universal-Image-Loader,它使得在界面上顯示網絡圖片的操做變得極度簡單,開發者不用關心如何從網絡上獲取圖片,也不用關心開啓線程、回收圖片資源等細節,Universal-Image-Loader已經把一切都作好了。這裏簡單介紹下HttpURLConnection和HttpClient的使用。至於框架後面會研究後,再介紹緩存
HttpClient的get使用cookie
HttpClient mClient; //http客戶端 public static HttpEntity getEntity(String uri,ArrayList<BasicNameValuePair> params,int method) throws ClientProtocolException, IOException{ mClient=new DefaultHttpClient(); HttpUriRequest request=null; switch (method) { case HTTP_GET://get請求 StringBuilder sb=new StringBuilder(uri); //判斷設置參數爲不爲空 if(null!=params&&!params.isEmpty()){ sb.append("?"); //設置配置參數 for (BasicNameValuePair param : params) { sb.append(param.getName()).append("=") .append(URLEncoder.encode(param.getValue(), "utf-8")).append("&"); } sb.deleteCharAt(sb.length()-1); //刪除多餘的 & } HttpGet get=new HttpGet(sb.toString()); //發送get請求 request=get; break; } //cookie緩存 HttpClientParams.setCookiePolicy(mClient.getParams(), CookiePolicy.BROWSER_COMPATIBILITY); //鏈接時間 mClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); //設置請求超時時間 mClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000); //執行請求 得到響應 HttpResponse response = mClient.execute(request); if(response.getStatusLine().getStatusCode()==200){ //若是成功 返回HttpEntity 對象 return response.getEntity(); } return null; }
HttpURLConnection的post使用 post是 表單方式請求的網絡
URL url =new URL(actionUrl); HttpURLConnection con=(HttpURLConnection)url.openConnection(); con.setReadTimeout(10 * 1000); //讀數請求時間 con.setConnectTimeout(10 * 1000); //鏈接超時 /* 容許Input、Output,不使用Cache */ con.setDoInput(true); //之後就可使用conn.getInputStream().read(); con.setDoOutput(true); //之後就可使用conn.getOutputStream().write() get用不到這個 con.setUseCaches(false); //不使用緩存 /* 設置傳送的method=POST */ con.setRequestMethod("POST"); /* setRequestProperty */ con.setRequestProperty("Connection", "Keep-Alive"); //保持tcp鏈接 con.setRequestProperty("Charset", "UTF-8"); //傳輸字符格式 UTF-8 con.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); /* 設置DataOutputStream */ DataOutputStream ds = new DataOutputStream(con.getOutputStream()); ds.writeBytes(twoHyphens + boundary + end); ds.writeBytes("Content-Disposition: form-data; "+ "name=\"file1\";filename=\""+ newName +"\""+ end); ds.writeBytes(end); /* 取得文件的FileInputStream */ FileInputStream fStream =new FileInputStream(uploadFile); /* 設置每次寫入1024bytes */ int bufferSize =1024; byte[] buffer =new byte[bufferSize]; int length =-1; /* 從文件讀取數據至緩衝區 */ while((length = fStream.read(buffer)) !=-1) { /* 將資料寫入DataOutputStream中 */ ds.write(buffer, 0, length); } ds.writeBytes(end); ds.writeBytes(twoHyphens + boundary + twoHyphens + end); /* close streams */ fStream.close(); ds.flush(); /* 取得Response內容 */ InputStream is = con.getInputStream(); int ch; StringBuffer b =new StringBuffer(); while( ( ch = is.read() ) !=-1 ) { b.append( (char)ch ); } /* 將Response顯示於Dialog */ showDialog("上傳成功"+b.toString().trim()); /* 關閉DataOutputStream */ ds.close();