android HTTP通訊

來源:互聯網
上載者:User

標籤:

HTTP協議簡介: 
         HTTP(Hypertext Transfer Protocol ),是Web連網的基礎,也是手機連網常用的協議之一,HTTP協議是建立在TCP協議之上的一種協議。 
         HTTP串連最顯著的特點是用戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放串連。從建立串連到關閉串連的過程稱為“一次串連”。  在HTTP 1.0中,用戶端的每次請求都要求建立一次單獨的串連,在處理完本次請求後,就自動釋放串連。  在HTTP 1.1中則可以在一次串連中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。
         由於HTTP在每次請求結束後都會主動釋放串連,因此HTTP串連是一種“短串連”、“無狀態”,要保持用戶端程式的線上狀態,需要不斷地向伺服器發起串連請求。通常的做法是即使不需要獲得任何資料,用戶端也保持每隔一段固定的時間向伺服器發送一次“保持串連”的請求,伺服器在收到該請求後對用戶端進行回複,表明知道用戶端“線上”。若伺服器長時間無法收到用戶端的請求,則認為用戶端“下線”,若用戶端長時間無法收到伺服器的回複,則認為網路已經斷開。 
         基於HTTP1.0協議的用戶端在每次向伺服器發出請求後,伺服器就會向用戶端返迴響應訊息,在確認用戶端已經收到響應訊息後,服務端就會關閉網路連接。在這個資料轉送過程中,並不儲存任何曆史資訊和狀態資訊,因此,HTTP協議也被認為是無狀態的協議。
         HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久串連支援。當用戶端使用HTTP1.1協議串連到伺服器後,伺服器就將關閉用戶端串連的主動權交還給用戶端;也就是說,只要不調用Socket類的close方法關閉網路連接,就可以繼續向伺服器發送HTTP請求。
         HTTP串連使用的是“請求—響應”的方式(2次握手),不僅在請求時需要先建立串連,而且需要用戶端向伺服器發出請求後,伺服器端才能回複資料。而Socket串連在雙方建立起串連後就可以直接進行資料的傳輸
         HTTP協議的特點:
         支援B/S及C/S模式;
         簡單快速:客戶向伺服器請求服務時,只需傳送要求方法和路徑。要求方法常用的有GET、HEAD、POST。
         靈活:HTTP 允許傳輸任意類型的資料對象。正在傳輸的類型由Content-Type 加以標記;
         無狀態:HTTP 協議是無狀態協議。無狀態是指協議對於交易處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次串連傳送的資料量增大。
         HTTP協議要求方法: 
         請求行中包括了要求方法,解釋如下:
         GET請求擷取Request-URI 所標識的資源;
         POST在Request-URI 所標識的資源後附加新的資料;
         HEAD請求擷取由Request-URI 所標識的資源的響應訊息前序    
         PUT請求伺服器儲存一個資源,並用Request-URI 作為其標識
         DELETE請求伺服器刪除Request-URI 所標識的資源;
         TRACE請求伺服器回送收到的請求資訊,主要用於測試或診斷
         CONNECT保留將來使用
         OPTIONS請求查詢服務器的效能,或者查詢與資源相關的選項和需求


HTTP通訊方式又分get和post兩種方式:
Post請求可以向伺服器傳送資料,而且資料放在HTMLHEADER內一起傳送到服務端URL地址,資料對使用者不可見。而get是把參數資料隊列加到提交的URL中,值和表單內各個欄位一一對應。post安全性較高。
get傳送的資料量較小,不能大於2KB。post傳送的資料量較大,一般被預設為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB,t安全性非常低。
Get 方式:

[java] view plaincopy
  1. public static InputStream getInputStream(String urlPath) {  
  2.  InputStream inputStream = null;  
  3.  try {  
  4.                 //參數拼接在urlPath中  
  5.   URL url = new URL(urlPath);  
  6.   HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
  7.   conn.setRequestMethod("GET");  
  8.   conn.setConnectTimeout(5 * 1000);  
  9.   conn.setRequestProperty("Charsert", "utf-8");  
  10.   if (conn.getContentLength() >0) {  
  11.     inputStream = conn.getInputStream();//擷取輸入資料流   
  12.   }  
  13.  } catch (Exception e) {  
  14.   // TODO Auto-generated catch block  
  15.   Log4debug.e(TAG, "getInputStream", e.getMessage());  
  16.  }  
  17.  return inputStream;  
  18. }  

Post方式:

[java] view plaincopy
  1. public static InputStream getInputStream(String urlPath) {  
  2.     InputStream inputStream = null;  
  3.     try {  
  4.         URL url = new URL(urlPath);  
  5.         HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
  6.         conn.setConnectTimeout(5 * 1000);  
  7.         conn.setRequestProperty("Charsert", "utf-8");  
  8.         conn.setDoInput(true);  
  9.         conn.setDoOutput(true);  
  10.         conn.setRequestMethod("POST");  
  11.         conn.setUseCaches(false);  
  12.         conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");  
  13.         DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream());  
  14.                 //寫參數  
  15.         outputStream.writeBytes("param="+URLEncoder.encode("value"));  
  16.         outputStream.flush();  
  17.         outputStream.close();  
  18.           
  19.         if (conn.getContentLength() >0) {  
  20.              inputStream = conn.getInputStream();//擷取輸入資料流   
  21.         }  
  22.     } catch (Exception e) {  
  23.         // TODO Auto-generated catch block  
  24.         Log4debug.e(TAG, "getInputStream", e.getMessage());  
  25.     }  
  26.     return inputStream;  
  27. }  

2.採用Apache http介面串連伺服器

<1> Get 方式:

[java] view plaincopy
  1. public static InputStream doGetForStream(String urlPath,Map<String, String> params,String encoding) {  
  2.     StringBuilder builder = new StringBuilder(urlPath);  
  3.     try {  
  4.         if (params !=null) {  
  5.             builder.append("?");  
  6.             Iterator<?> iterator = params.entrySet().iterator();  
  7.             while (iterator.hasNext()) {  
  8.                 @SuppressWarnings("unchecked")  
  9.                 Map.Entry<String,String> entry = (Map.Entry<String,String>)iterator.next();   
  10.                 builder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");  
  11.             }  
  12.             builder.deleteCharAt(builder.length()-1);  
  13.         }  
  14.         HttpGet httpGet = new HttpGet(builder.toString());  
  15.         HttpParams httpParams = new BasicHttpParams();  
  16.         httpParams.setParameter("charset", encoding);  
  17.         httpGet.setParams(httpParams);  
  18.         HttpResponse httpResponse = new DefaultHttpClient().execute(httpGet);  
  19.         if (httpResponse!= null &&  httpResponse.getStatusLine().getStatusCode() == 200) {  
  20.             return httpResponse.getEntity().getContent();  
  21.         }else {  
  22.             return null;  
  23.         }  
  24.     } catch (Exception e) {  
  25.         // TODO Auto-generated catch block  
  26.         Log4debug.e(TAG, "doGetForStream", e.getMessage());  
  27.         return null;  
  28.     }  
  29. }  

<2> Post方式:

[java] view plaincopy
  1. public static InputStream doPostForStream(String urlPath,List<NameValuePair> params,String encoding) {  
  2.     HttpPost httpPost = new HttpPost(urlPath);  
  3.     try {  
  4.         if (params != null) {  
  5.             httpPost.setEntity(new UrlEncodedFormEntity(params,encoding));  
  6.         }  
  7.         HttpResponse httpResponse = new DefaultHttpClient().execute(httpPost);  
  8.         if (httpResponse!= null && httpResponse.getStatusLine().getStatusCode() == 200) {  
  9.             return httpResponse.getEntity().getContent();  
  10.         }else {  
  11.             return null;  
  12.         }  
  13.     } catch (Exception e) {  
  14.         // TODO Auto-generated catch block  
  15.         Log4debug.e(TAG, "doPostForStream", e.getMessage());  
  16.         return null;  
  17.     }  
  18. }  

android HTTP通訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.