2020年8月26日 星期三

.Net WebForm界接Json資料-5

 在上一篇提到介接Json資料的主程式內時呼叫函數GetJsonContent,而這個函數的作用是甚麼?

不是已經給他目標網址了,為甚麼還要使用難樹來處理Url,當然沒個語法有不同之處,若在

單機可僅給目標網址即可下在所需的介接資料,而目前是Web必須告訴伺服器要處理甚麼事情。

舉例說我在自己的房間跟自己說要跟小明借5萬元,但小明並不知道你要跟他借錢,因此你必

須跟小明見面或電話告知你要跟他借5萬元;在這個過程的見面或電話告知就是該範例函數的

作用,大致上是這樣一個邏輯,所以下圖為函數的程式碼


string content = GetJsonContent("https://www.ktec.gov.tw/ktec_api.php?type=json");

這是主程式目標網址,但前面有GetJsonContent為函數,就是將目標網址該字串丟入函數中。

private static string GetJsonContent(string Url)

{

    程式區塊

}

在函數中第一行可看到設定私有,也就是外部的類別是無法法存取,將處理的結果直接呈現,

所以主程式有呼叫函數執行,以下為程式說明。

  • static 靜態宣告,靜態方法在程式加載時就已經存在,故在使用前無需初始化(new)就能直接訪問。

  • void 沒有返回值宣告,也就是要return 關鍵字。

string targetURI = Url;
var request = System.Net.WebRequest.Create(targetURI); 

  • 設字串targetURL來接丟進副程式字串參數string Url。
    設變數request來向targetURI網址送出請求,怎麼請求?
    使用【System.Net命名空間】中的【WebRequest類別】的【create方法】來向【targetURI】請求
request.ContentType = "application/json; charset=utf-8"; 
  • 告訴伺服器端,即將傳輸的請求資料的MIME類型
var response = request.GetResponse(); 
  • 設變數response來接送出請求之伺服器之response。

string text; 
using (var sr = new StreamReader(response.GetResponseStream()))
{
    text = sr.ReadToEnd();
}
  • 建立一個字串text,方便後面使用
  • 利用response.GetResponseStream()方法,回傳來自網際網路資源的資料流(stream),並透過初始化StreamReader類別來從資料流中(Stream)讀取字元,最後再建立一個物件sr來接。
  • using 陳述式:在建立物件sr的當時,使用 using 陳述式,當這個區塊程式碼結束執行之後,能確保該物件所佔用的資源一定會被完整釋放。
  • ReadToEnd()方法是直接讀取資料流中,目前位置開始到整個資料流結束的所有字元,並且回傳string 型別結果字串,代入前面建立的字串text。
所以整個函數的撰寫邏輯如下
  1. 將函數設為靜態static,直要程式家在函數就存在無須初始化,對於介接程式而言會隨時目標網址資料會隨時更新,因此設為靜態。
  2. 將目標網址設定一個變數,供函數內使用,方便後面對於網址字串處理。
  3. 要求目標網址Request,並告訴伺服器目標網址的資料為Json,字元為Utf-8。
  4. 伺服器回應Respone,並設一個變數接伺服器的回應。
  5. 羧後將結果傳回函數中。
其實在寫函數這一段中,參閱很多相關資料中,我一直有個疑惑,為什麼一個網址字串
需要如此大費周章地處理,原因為Web也就是三層式的架構,你必須在中間告知你者個
網址要做些甚麼,其實在MVC中的Contro中也是在處理中間這一段網路的路由。
對於單跡象R語言相對對於目標網址的要求,就是點對點很直覺無須處理中間層的需求。












沒有留言:

張貼留言

無現金支付的反思!

  **購物經歷** - 作者花費大量時間尋找立燈,最終在IKEA購買了一個649元的立燈 - 在IKEA附近停車場遇到只接受無現金支付的情況,被迫註冊並使用Line Pay **無現金支付的觀察** - 作者認為Line Pay作為前端介面,有助於提高停車場付費效率 - 作者預...