Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android應用開發入門(十)HTTP協議

Android應用開發入門(十)HTTP協議

編輯:Android開發實例

前言

  說到HTTP協議,那必須要說說WWW了,WWW是環球信息網(World Wide Web )的縮寫,也可以簡稱為Web,中文名字為“萬維網”。簡單來說,WWW是以Internet作為傳輸媒介的一個應用系統,WWW網上基本的傳輸單位是Web網頁。WWW的工作是基於B/S模型,由Web浏覽器和Web服務器構成,兩者之間采用超文本傳輸協議HTTP協議進行通信。

   HTTP協議是基於TCP/IP協議之上的協議,是Web浏覽器和Web服務器之間的應用層的協議,是通用的、無狀態的面向對象的協議。這裡主要是說明HTTP在Java中的應用,為從其他技術下轉向Android開發打好基礎。

  首先普及一下網絡協議的知識,數據在Internet上傳輸,一般通過三種協議來實現發送信息和實現:

  1. HTTP協議,也是在工作中最常用的,是建立在TCP/IP基礎上實現的。
  2. FTP協議。
  3. TCP/IP協議,它也是最低層的協議,其它的方式必須要通過它,但是想要實現這種協議必須要實現socket編程,這種方法是用來上傳一些比較大的文件,視頻,進行斷電續傳的操作。

HTTP協議

  下面詳細講解一下HTTP協議,因為HTTP是無狀態的協議,所以服務端並不記錄客戶端之前發送信息,一碼歸一碼,所以HTTP協議使用報文頭的形式記錄狀態,一般分為請求報文和響應報文。一般用戶使用浏覽器訪問網頁,是無需關心HTTP請求的報文頭的,因為開發人員已經浏覽器已經幫忙處理了,但是當進行開發工作的時候,這些是必須要了解的。

  對於報文,一般關心請求方式,是GET或者是POST;請求數據類型,是文本還是音頻;數據的編碼格式,一般用utf-8;發送的數據長度;響應返回碼,一般200為成功,其他響應碼都是有問題。具體了解還是看看上面推薦的博客。

  HTTP/1.1協議中一共定義了八種方法(有時也叫“動作”)來表明Request-URI指定的資源的不同操作方式,但是一般常用的就是GET和POST方式。

  這裡簡單說一下GET方式和POST方式的差別:

  1. GET是從服務器上獲取數據,POST是向服務器傳送數據。
  2. 在客戶端,GET方式在通過URL提交數據,數據在URL中可以看到;POST方式,數據放在HTML HEADER內提交。
  3. 對於GET方式,服務器端用Request.QueryString獲取變量的值,對於POST方式,服務器用Request.Form獲取提交的數據。
  4. GET方式提交的數據不能大於2KB(主要是URL長度限制),而POST則沒有此限制。
  5. 安全性問題。正如2中提到,使用GET的時候,參數會顯示在地址欄上,而POST不會。所以,如果這些數據是中文數據而且是非敏感數據,那麼使用GET;如果用戶輸入的數據不是中文字符而且包含敏感數據,那麼還是使用POST為好。

Java中使用HTTP

  下面通過兩個例子來分別講解一下GET和POST在Java中的使用,如果在Java中需要使用HTTP協議進行訪問,一般通過HttpURLConnection類來實現。

  HttpURLConnection繼承了URLConnection,所以在URLConnection的基礎上進一步改進,增加了一些用於操作HTTP資源的便捷方法。Java中HttpURLConnection對象通過URL.openConnection()方法來獲得,需要進行強制轉換。先來介紹幾個HttpURLConnection的常用方法:

  • void setConnectTimeout(int timeout):設置連接超時市場,如果超過timeout市場,則放棄連接,單位以毫秒計算。
  • void setDoInput(boolean newValue) :標志是否允許輸入。
  • void setDoOutput(boolean newValue):標志是否允許輸出。String getRequestMethod():獲取發送請求的方法。
  • int getResponseCode():獲取服務器的響應碼。
  • void setRequestMethod(String method):設置發送請求的方法。
  • void setRequestProperty(String field,String newValue):設置請求報文頭,並且只對當前HttpURLConnection有效。

 

GET方式

  這個例子通過GET方式從服務端獲取一張圖片的信息,並把其保存在本地磁盤中。服務器為本機上的IIS,一張靜態圖片,直接通過URL訪問。

  直接上Java代碼,注釋已經解釋的很清楚了。

  1. package com.http.get;  
  2.  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.net.HttpURLConnection;  
  7. import java.net.MalformedURLException;  
  8. import java.net.URL;  
  9.  
  10. public class HttpUtils {  
  11.     private static String URL_PATH = "http://192.168.1.106:8080/green.jpg";  
  12.     /**  
  13.      * @param args  
  14.      */ 
  15.     public static void main(String[] args) {  
  16.         // 調用方法獲取圖片並保存  
  17.         saveImageToDisk();  
  18.     }  
  19.     /**  
  20.      * 通過URL_PATH的地址訪問圖片並保存到本地  
  21.      */ 
  22.     public static void saveImageToDisk()  
  23.     {  
  24.         InputStream inputStream= getInputStream();  
  25.         byte[] data=new byte[1024];  
  26.         int len=0;  
  27.         FileOutputStream fileOutputStream=null;  
  28.         try {  
  29.             //把圖片文件保存在本地F盤下  
  30.             fileOutputStream=new FileOutputStream("F:\\test.png");  
  31.             while((len=inputStream.read(data))!=-1)   
  32.             {  
  33.                 //向本地文件中寫入圖片流  
  34.                 fileOutputStream.write(data,0,len);                  
  35.             }  
  36.         } catch (IOException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.         finally 
  40.         {  
  41.             //最後關閉流  
  42.             if(inputStream!=null)  
  43.             {  
  44.                 try {  
  45.                     inputStream.close();  
  46.                 } catch (IOException e) {  
  47.                     e.printStackTrace();  
  48.                 }  
  49.             }  
  50.             if(fileOutputStream!=null)  
  51.             {  
  52.                 try {  
  53.                     fileOutputStream.close();  
  54.                 } catch (IOException e) {  
  55.                     e.printStackTrace();  
  56.                 }  
  57.             }  
  58.         }  
  59.     }  
  60.     /**  
  61.      * 通過URL獲取圖片  
  62.      * @return URL地址圖片的輸入流。  
  63.      */ 
  64.     public static InputStream getInputStream() {  
  65.         InputStream inputStream = null;  
  66.         HttpURLConnection httpURLConnection = null;  
  67.  
  68.         try {  
  69.             //根據URL地址實例化一個URL對象,用於創建HttpURLConnection對象。  
  70.             URL url = new URL(URL_PATH);  
  71.  
  72.             if (url != null) {  
  73.                 //openConnection獲得當前URL的連接  
  74.                 httpURLConnection = (HttpURLConnection) url.openConnection();  
  75.                 //設置3秒的響應超時  
  76.                 httpURLConnection.setConnectTimeout(3000);  
  77.                 //設置允許輸入  
  78.                 httpURLConnection.setDoInput(true);  
  79.                 //設置為GET方式請求數據  
  80.                 httpURLConnection.setRequestMethod("GET");  
  81.                 //獲取連接響應碼,200為成功,如果為其他,均表示有問題  
  82.                 int responseCode=httpURLConnection.getResponseCode();  
  83.                 if(responseCode==200)  
  84.                 {  
  85.                     //getInputStream獲取服務端返回的數據流。  
  86.                     inputStream=httpURLConnection.getInputStream();  
  87.                 }  
  88.             }  
  89.  
  90.         } catch (MalformedURLException e) {  
  91.             e.printStackTrace();  
  92.         } catch (IOException e) {  
  93.             e.printStackTrace();  
  94.         }  
  95.         return inputStream;  
  96.     }  
  97.  

POST方式

  這個例子通過POST方式訪問一個登陸頁面,需要輸入用戶名(username)和密碼(password)。雖然這裡使用的Java在講解問題,但是服務端是使用.Net的框架,一個很簡單的HTML頁面加一個表單傳送的一般處理程序,輸入為admin+123為登陸成功,這裡不累述了。

  Java代碼:

  1. package com.http.post;  
  2.  
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.OutputStream;  
  7. import java.io.UnsupportedEncodingException;  
  8. import java.net.HttpURLConnection;  
  9. import java.net.URL;  
  10. import java.net.URLEncoder;  
  11. import java.util.HashMap;  
  12. import java.util.Map;  
  13.  
  14. public class postUtils {  
  15.  
  16.     private static String PATH = "http://192.168.222.1:1231/loginas.ashx";  
  17.     private static URL url;  
  18.  
  19.     public postUtils() {  
  20.     }  
  21.     static {  
  22.         try {  
  23.             url = new URL(PATH);  
  24.         } catch (Exception e) {  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  
  28.       
  29.     /**  
  30.      * 通過給定的請求參數和編碼格式,獲取服務器返回的數據  
  31.      * @param params 請求參數  
  32.      * @param encode 編碼格式  
  33.      * @return 獲得的字符串  
  34.      */ 
  35.     public static String sendPostMessage(Map<String, String> params,  
  36.             String encode) {  
  37.         StringBuffer buffer = new StringBuffer();  
  38.         if (params != null && !params.isEmpty()) {  
  39.             for (Map.Entry<String, String> entry : params.entrySet()) {  
  40.                 try {  
  41.                     buffer.append(entry.getKey())  
  42.                             .append("=")  
  43.                             .append(URLEncoder.encode(entry.getValue(), encode))  
  44.                             .append("&");//請求的參數之間使用&分割。  
  45.                 } catch (UnsupportedEncodingException e) {  
  46.                     e.printStackTrace();  
  47.                 }  
  48.  
  49.             }  
  50.             buffer.deleteCharAt(buffer.length() - 1);  
  51.             System.out.println(buffer.toString());  
  52.             try {  
  53.                 HttpURLConnection urlConnection = (HttpURLConnection) url  
  54.                         .openConnection();  
  55.                 urlConnection.setConnectTimeout(3000);  
  56.                 //設置允許輸入輸出  
  57.                 urlConnection.setDoInput(true);  
  58.                 urlConnection.setDoOutput(true);  
  59.                 byte[] mydata = buffer.toString().getBytes();  
  60.                 //設置請求報文頭,設定請求數據類型  
  61.                 urlConnection.setRequestProperty("Content-Type",  
  62.                         "application/x-www-form-urlencoded");  
  63.                 //設置請求數據長度  
  64.                 urlConnection.setRequestProperty("Content-Length",  
  65.                         String.valueOf(mydata.length));  
  66.                 //設置POST方式請求數據  
  67.                 urlConnection.setRequestMethod("POST");  
  68.                 OutputStream outputStream = urlConnection.getOutputStream();  
  69.                 outputStream.write(mydata);  
  70.                 int responseCode = urlConnection.getResponseCode();  
  71.                 if (responseCode == 200) {  
  72.                     return changeInputStream(urlConnection.getInputStream(),  
  73.                             encode);  
  74.                 }  
  75.             } catch (IOException e) {  
  76.                 e.printStackTrace();  
  77.             }  
  78.         }  
  79.         return "";  
  80.     }  
  81.  
  82.     /**  
  83.      * 把服務端返回的輸入流轉換成字符串格式  
  84.      * @param inputStream 服務器返回的輸入流  
  85.      * @param encode 編碼格式  
  86.      * @return 解析後的字符串  
  87.      */ 
  88.     private static String changeInputStream(InputStream inputStream,  
  89.             String encode) {   
  90.         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();  
  91.         byte[] data = new byte[1024];  
  92.         int len = 0;  
  93.         String result="";  
  94.         if (inputStream != null) {  
  95.             try {  
  96.                 while ((len = inputStream.read(data)) != -1) {  
  97.                     outputStream.write(data,0,len);                      
  98.                 }  
  99.                 result=new String(outputStream.toByteArray(),encode);  
  100.                   
  101.             } catch (IOException e) {  
  102.                 e.printStackTrace();  
  103.             }  
  104.         }  
  105.         return result;  
  106.     }  
  107.  
  108.     /**  
  109.      * @param args  
  110.      */ 
  111.     public static void main(String[] args) {  
  112.         //通過Map設置請求字符串。  
  113.         Map<String, String> params = new HashMap<String, String>();  
  114.         params.put("username", "admin");  
  115.         params.put("password", "123");          
  116.         String result=sendPostMessage(params, "utf-8");  
  117.         System.out.println(result);  
  118.     }  
  119.  

 

示例代碼下載 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved