http程序接口、調用(最入門級,文末附Demo)


HTTP協議簡介

 既然是基於HTTP協議開發,那么就首先要了解下HTTP協議的相關內容~

在TCP/IP體系結構中,HTTP屬於應用層協議,位於TCP/IP協議的頂層。瀏覽Web時,瀏覽器通過HTTP協議與Web服務器交換信息。這些信息(文檔)類型的格式由MIME定義。

HTTP協議具有以下的特點:

    1. HTTP按客戶/服務器模式工作
      HTTP支持客戶(一般情況是瀏覽器)與服務器的通訊,相互傳輸數據。
      HTTP定義的事務處理由以下四步組成:
      • 客戶與服務器建立連接;
      • 客戶向服務器提出請求;
      • 如果請求被接受,則服務器送回響應,在響應中包括狀態碼和所需的文件;
      • 客戶與服務器斷開連接
    1. 一次HTTP操作稱為一次事務(transaction)。
    2. HTTP是無狀態的
      也就是說,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。
    3. HTTP使用元信息作為頭標
      HTTP對所有事務都加了頭標(header)。也就是說,在主要數據前加上一塊信息,稱為元信息(metainformation)。它使服務器能夠提供正在傳送數據的有關信息。例如,傳送對象是哪種類型,是用哪種語言書寫的等。
      從功能上講,HTTP支持四類元信息:一般信息頭標、請求頭標、響應頭標和實體頭標。
    4. HTTP支持兩種請求和響應格式
      HTTP由不同的兩部分組成,一是從瀏覽器發往服務器的請求,二是服務器對客戶的響應。
      HTTP支持兩種請求和響應,即簡單請求與完全請求和簡單響應與完全響應。
    5. HTTP是基於文本的簡單協議

HTTP請求的格式如下所示:

1 <request-line>  
2 <headers>  
3 <blank line>  
4 [<request-body>]

在HTTP請求中,第一行必須是一個請求行(request line),用來說明請求類型、要訪問的資源以及使用的HTTP版本。緊接着是一個首部(header)小節,用來說明服務器要使用的附加信息。在首部之后是一個空行,再此之后可以添加任意的其他數據[稱之為主體(body)]。
在HTTP中,定義了大量的請求類型,不過Ajax開發人員關心的只有GET請求和POST請求。只要在Web瀏覽器上輸入一個URL,瀏覽器就將基於該URL向服務器發送一個GET請求,以告訴服務器獲取並返回什么資源。對於URL為XXX的GET請求如下所示:

1 GET / HTTP/1.1  
2 Host: XXX   
3 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)  
4 Gecko/20050225 Firefox/1.0.1  
5 Connection: Keep-Alive   

請求行的第一部分說明了該請求是GET請求。該行的第二部分是一個斜杠(/),用來說明請求的是該域名的根目錄。該行的最后一部分說明使用的是HTTP 1.1版本(另一個可選項是1.0)。那么請求發到哪里去呢?這就是第二行的內容。
第2行是請求的第一個首部,HOST。首部HOST將指出請求的目的地。結合HOST和上一行中的斜杠(/),可以通知服務器請求的是XXX(HTTP 1.1才需要使用首部HOST,而原來的1.0版本則不需要使用)。第三行中包含的是首部User-Agent,服務器端和客戶端腳本都能夠訪問它,它是瀏覽器類型檢測邏輯的重要基礎。該信息由你使用的瀏覽器來定義(在本例中是Firefox 1.0.1),並且在每個請求中將自動發送。最后一行是首部Connection,通常將瀏覽器操作設置為Keep-Alive)。注意,在最后一個首部之后有一個空行。即使不存在請求主體,這個空行也是必需的。

如果要獲取一個諸如XXX/xxx的XXX域內的頁面,那么該請求可能類似於:

1 GET /xxx/ HTTP/1.1  
2 Host: XXX  
3 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)  
4 Gecko/20050225 Firefox/1.0.1  
5 Connection: Keep-Alive  
注意只有第一行的內容發生了變化,它只包含URL中XXX后面的部分。

要發送GET請求的參數,則必須將這些額外的信息附在URL本身的后面。其格式類似於:

URL ? name1=value1&name2=value2&..&nameN=valueN


該信息稱之為查詢字符串(query string),它將會復制在HTTP請求的請求行中,如下所示

1 GET /xxx/?name=Professional%20Ajax HTTP/1.1  
2 Host: XXX  
3 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)  
4 Gecko/20050225 Firefox/1.0.1  
5 Connection: Keep-Alive  
另一方面,POST請求在請求主體中為服務器提供了一些附加的信息。通常,當填寫一個在線表單並提交它時,這些填入的數據將以POST請求的方式發送給服務器。

以下就是一個典型的POST請求:

1 POST / HTTP/1.1  
2 Host: XXX  
3 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)  
4 Gecko/20050225 Firefox/1.0.1  
5 Content-Type: application/x-www-form-urlencoded  
6 Content-Length: 40  
7 Connection: Keep-Alive  
8 name=Professional%20Ajax&publisher=Wiley  
從上面可以發現, POST請求和GET請求之間有一些區別。首先,請求行開始處的GET改為了POST,以表示不同的請求類型。你會發現首部Host和User-Agent仍然存在,在后面有兩個新行。其中首部Content-Type說明了請求主體的內容是如何編碼的。瀏覽器始終以application/ x-www-form- urlencoded的格式編碼來傳送數據,這是針對簡單URL編碼的MIME類型。首部Content-Length說明了請求主體的字節數。在首部Connection后是一個空行,再后面就是請求主體。與大多數瀏覽器的POST請求一樣,這是以簡單的“名稱—值”對的形式給出的,其中name是Professional Ajax,publisher是Wiley。你可以以同樣的格式來組織URL的查詢字符串參數。

正如前面所提到的,還有其他的HTTP請求類型,它們遵從的基本格式與GET請求和POST請求相同。下一步我們來看看服務器將對HTTP請求發送什么響應。

HTTP響應

如下所示,HTTP響應的格式與請求的格式十分類似:

1 <status-line>  
2 <headers>  
3 <blank line>  
4 [<response-body>]  

正如你所見,在響應中唯一真正的區別在於第一行中用狀態信息代替了請求信息。狀態行(status line)通過提供一個狀態碼來說明所請求的資源情況。以下就是一個HTTP響應的例子: 

 1 HTTP/1.1 200 OK  
 2 Date: Sat, 31 Dec 2005 23:59:59 GMT  
 3 Content-Type: text/html;charset=ISO-8859-1  
 4 Content-Length: 122  
 5   
 6 <html>  
 7 <head>  
 8 <title>Wrox Homepage</title>  
 9 </head>  
10 <body>  
11 <!-- body goes here -->  
12 </body>  
13 </html>  

在本例中,狀態行給出的HTTP狀態代碼是200,以及消息OK。狀態行始終包含的是狀態碼和相應的簡短消息,以避免混亂。最常用的狀態碼有:

  • 200 (OK): 找到了該資源,並且一切正常。
  • 304 (NOT MODIFIED): 該資源在上次請求之后沒有任何修改。這通常用於瀏覽器的緩存機制。
  • 401 (UNAUTHORIZED):客戶端無權訪問該資源。這通常會使得瀏覽器要求用戶輸入用戶名和密碼,以登錄到服務器。
  • 403 (FORBIDDEN):客戶端未能獲得授權。這通常是在401之后輸入了不正確的用戶名或密碼。
  • 404 (NOT FOUND):在指定的位置不存在所申請的資源。

 

在狀態行之后是一些首部。通常,服務器會返回一個名為Date的首部,用來說明響應生成的日期和時間(服務器通常還會返回一些關於其自身的信息,盡管並非是必需的)。接下來的兩個首部大家應該熟悉,就是與POST請求中一樣的Content-Type和Content-Length。在本例中,首部Content-Type指定了MIME類型HTML(text/html),其編碼類型是ISO-8859-1(這是針對美國英語資源的編碼標准)。響應主體所包含的就是所請求資源的HTML源文件(盡管還可能包含純文本或其他資源類型的二進制數據)。瀏覽器將把這些數據顯示給用戶。
注意,這里並沒有指明針對該響應的請求類型,不過這對於服務器並不重要。客戶端知道每種類型的請求將返回什么類型的數據,並決定如何使用這些數據

與HTTP相關類的簡介

WebRequest類

WebRequest 是 .NET Framework 的用於訪問 Internet 數據的請求/響應模型的抽象基類。使用該請求/響應模型的應用程序可以用協議不可知的方式從 Internet 請求數據。在這種方式下,應用程序處理 WebRequest 類的實例,而協議特定的子類則執行請求的具體細節。

請求從應用程序發送到某個特定的 URI,如服務器上的 Web 頁。URI 從一個為應用程序注冊的WebRequest 子代列表中確定要創建的適當子類。注冊 WebRequest 子代通常是為了處理某個特定的協議(如 HTTP 或 FTP),但是也可以注冊它以處理對特定服務器或服務器上的路徑的請求。

由於 WebRequest 類是一個抽象類,所以 WebRequest 實例在運行時的實際行為由 WebRequest.Create 方法所返回的子類確定。

注意 使用 Create 方法初始化新的 WebRequest 實例。不要使用 WebRequest 構造函數。

下面的示例說明如何創建 WebRequest 實例並返回響應。

 

1 // Initialize the WebRequest.  
2 WebRequest myRequest = WebRequest.Create("xxx");  
3 // Return the response.   
4 WebResponse myResponse = myRequest.GetResponse();  
5 // Code to use the WebResponse goes here.  
6 // Close the response to free resources.  
7 myResponse.Close();  

WebResponse 類

WebResponse 類是抽象(在 Visual Basic 中為 MustInherit)基類,協議特定的響應類從該抽象基類派生。應用程序可以使用 WebResponse 類的實例以協議不可知的方式參與請求和響應事務,而從 WebResponse 派生的協議特定的類攜帶請求的詳細信息。

客戶端應用程序不直接創建 WebResponse 對象,而是通過調用 WebRequest 實例上的GetResponse 方法來創建它。

下面的示例從 WebRequest 創建 WebResponse 實例。 

1 // Initialize the WebRequest.  
2 WebRequest myRequest = WebRequest.Create("xxx");  
3 // Return the response.   
4 WebResponse myResponse = myRequest.GetResponse();  
5 // Code to use the WebResponse goes here.  
6 // Close the response to free resources.  
7 myResponse.Close(); 

HttpWebRequest 類

HttpWebRequest 類對 WebRequest 中定義的屬性和方法提供支持,也對使用戶能夠直接與使用 HTTP 的服務器交互的附加屬性和方法提供支持。

不要使用 HttpWebRequest 構造函數。使用 WebRequest.Create 方法初始化HttpWebRequest 的一個新實例。如果 URI 的方案是 http:// 或 https://,則 Create 將返回 HttpWebRequest 實例。

GetResponse 方法向 RequestUri 屬性中指定的 Internet 資源發出同步請求並返回包含該響應的HttpWebResponse 實例。可以使用 BeginGetResponse 和 EndGetResponse 方法對 Internet 資源發出異步請求。

當要向 Internet 資源發送數據時,GetRequestStream 方法返回用於發送數據的Stream實例。BeginGetRequestStream 和 EndGetRequestStream 方法提供對發送數據流的異步訪問。

下面的示例為 URI xxx 創建 HttpWebRequest

1 HttpWebRequest myReq =(HttpWebRequest)WebRequest.Create("xxx");  

通過調用 GetResponseStream 方法,以 Stream 的形式返回來自 Internet 資源的響應的內容。

下面的示例返回 HttpWebRequest 的 HttpWebResponse

1 HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("xxx");  
2 HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();  
3 // Insert code that uses the response object.  
4 HttpWResp.Close() 

1 Uri siteUri = new Uri("xxx");  
2 WebRequest wr = WebRequest.Create(siteUri);  

Demo篇

 


 

創建一個test的aspx頁面

 

創建獲取請求方法

 1  public string GetPost()
 2         {
 3             if ("POST" == Request.RequestType)
 4             {
 5                 System.IO.Stream sm = Request.InputStream;//獲取post正文
 6                 int len = (int)sm.Length;//post數據長度
 7                 byte[] inputByts = new byte[len];//字節數據,用於存儲post數據
 8                 sm.Read(inputByts, 0, len);//將post數據寫入byte數組中
 9                 sm.Close();//關閉IO流
10                 //**********下面是把字節數組類型轉換成字符串**********
11                 string data = Encoding.GetEncoding("UTF-8").GetString(inputByts);//轉為unicode編碼
12                 //data = Server.UrlDecode(data);//url參數用到.
13                 return data;
14             }
15             else
16                 return null;
17         }

 

在Load中使用Response

1 string res = GetPost();
2 Response.Write(res);

調用篇


 新建一個解決方案調用上述程序

Main方法中代碼如下所示:

1 string ss = "hello world!";
2             Encoding encoding = Encoding.GetEncoding("utf-8");
3             byte[] bytesToPost = encoding.GetBytes(ss);
4             string res = Post("http://localhost:23094/test.aspx", bytesToPost);
5             Console.WriteLine(res);
6             Console.ReadLine();

其中Post方法傳入urlbytesToPost

 1  private static string Post(string url, byte[] bytesToPost)
 2         {
 3             if (String.IsNullOrEmpty(url))
 4                 return "url參數為空值";
 5             if (bytesToPost == null)
 6                 return "post數據為空值";
 7             string ResponseString = "";
 8             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
 9             System.Net.ServicePointManager.DefaultConnectionLimit = 50;
10             request.KeepAlive = false;
11             request.Method = "POST";
12             request.ContentType = "text/xml";//提交xml   
13             request.ContentLength = bytesToPost.Length;
14             Stream writer = request.GetRequestStream();
15             writer.Write(bytesToPost, 0, bytesToPost.Length);
16             HttpWebResponse HttpWebRespon = (HttpWebResponse)request.GetResponse();
17             StreamReader myStreamReader = new StreamReader(HttpWebRespon.GetResponseStream(), Encoding.UTF8);
18             ResponseString = myStreamReader.ReadToEnd();
19             myStreamReader.Close();
20 
21             writer.Flush();
22             if (writer != null)
23             {
24                 writer.Close();
25             }
26             if (request != null)
27             {
28                 request.Abort();
29             }
30             return ResponseString;
31         }
View Code

效果,先運行Demo 程序再運行調用程序即可看到如下效果

請求成功,返回結果

PS:具體代碼執行過程大家可以下完Demo后自行debug看看,代碼灰常簡單,算是最簡單的http請求和響應以及調用的流程了,在復雜的過程也是基於這個流程來執行的

Demo 地址

https://github.com/XiaoYong666/Http-interface-call

注:介紹部分內容轉載摘抄自網絡,若有文章雷同,請評論留言~定會及時注明出處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM