只有累積,沒有奇蹟

顯示具有 HTTP 標籤的文章。 顯示所有文章
顯示具有 HTTP 標籤的文章。 顯示所有文章

2019年6月22日 星期六

[VisualStudio] Visual Studio Code 實用套件 - REST Client

前言
有 API 開發經驗的人相信都使用過 Postman 來模擬使用端發出的 Request 進行測試,今天要介紹另一套工具與 Postman 相似 - REST CLIENT,根據官網的敘述如下
REST Client allows you to send HTTP request and view the response in Visual Studio Code directly.
Rest Client 套件讓開發者可以在 Visual Studio 中發送 HTTP Request 請求並看 Response 結果,這篇就介紹 REST CLIENT 的基本使用方式,若有問題或是錯誤的地方歡迎網路的高手大大給予指導

安裝
在 Visual Studio 安裝十分簡單,搜尋 REST CLIENT 後點選 install 即可

使用
接著在 Visual Studio Code 中新增檔案,在檔案中輸入測試網址 https://example.com/comments/1,右下角 Language Mode 選擇  HTTP  模式,可以看到網址列上方出現  Send Request  的灰色按鈕,可以選擇使用滑鼠點擊 Send Request 或是用快速鍵 Ctrl + Alt + R 執行,在 Visual Studio 右邊區塊會呈現 Response 結果,左下角則可以看到本次 Request 的執行時間與對方 Server 回傳 Reponse 內容大小
或者可以選擇發送的 RFC2616 標準的請求,以下為發送 Post 且指定 contentType 為 json 的請求範例
POST https://example.com/comments HTTP/1.1
content-type: application/json

{
    "name": "Marcus blog",
    "time": "Wed, 21 Mar 2019 18:27:50 GMT"
}
如果包含多個請求可以透過  ###  來分開

Generate Code
另外一個強大的功能是 Generate Code Snippet ,可以將輸入測試的 HTTP 請求轉化為不同程式語言,目前支援轉換的語言為 C、C#、Go、Java、Javascript、Node.js...等主流程式語言都支援,官方的示意如下
REST CLIENT 官方介紹有提供更多強大的功能與使用情境,像是也支援 cURL 語法、自定義請求的變數、設定 SSL與儲存 Response 資訊等好用的功能,這裡就不在做更多說明有興趣可以到官方 GitHub 了解。

感想
感謝強者同事介紹這麼好用的工具,自己在了解 REST CLIENT 功能時想到如果有了 Generate Code 功能,或許可以將使用 REST CLIENT 測試 API  的請求,轉化為單元測試的代碼 (如果懶得自己寫的話 XD),這樣也可以省下寫代碼的時間,加入情境測試對於程式碼更有保護,也提供各位在測試 API 時有不一樣的選擇  :)

參考
REST Client
[VSCode插件推荐] REST Client: 也许是比Postman更好的选择

2019年1月9日 星期三

2018年10月19日 星期五

[C#] Web API - HttpClient 入門

HttpClient 介紹
當在開發 Client 程式時,要取得呈現在畫面上的資料會與 API / Server 進行連線動作,在過去可以使用 WebClient 或者是 HttpWebRequest ,在 .NET Framework 4.5 開始微軟提供 HttpClient 類別給開發者使用命名空間為 Sysyem.Net.Http,它提供靈活且可擴充的 API 來訪問 HTTP 公開的物件,發送 Request 跟接收回傳的 Response 主要是透過 HttpRequestMessage HttpResponseMessage 這兩個類別,透過 Content 屬性取得 HTTP 回傳內容與訊息;工作原理可以參考下圖
HttpClient 與 WebClient 和 HttpWebRequest 相比,有以下幾點值得注意的地方

1. HttpClient 實現允許默認標題 (default headers) 被設置並應用於所有請求,取消未完成請求
2. 可以透過單一 HttpClient instance 發送多個請求
3. HttpClient instance 不會與 Http Server 或是 Host綁定,也就是說可以使用相同 HttpClient 向 www.a.com 與 www.b.com 發送 request
4. HttpClient 使用新的工作式非同步模式 (TAP) 來處理非同步請求,處理與管理未完成請求變得較為容易

使用方式 
HttpClient 提供多個非同步方法取得 HTTP 內容,有 GET / POST / PUT / DELETE...等
以下為使用 HttpClient 進行 HTTP GET請求的範例程式 -> 這裡使用的是國家城市資訊的 geonames API

方式 1 - using GetAsync 

namespace HttpClientSample
{
    class Program
    {
 private const string uri = "http://api.geonames.org/search";

 static void Main(string[] args)
 {
  Run();

  Console.WriteLine("Hit enter to exit...");
  Console.ReadKey();
 }

 static async void Run()
 {
  using (HttpClient client = new HttpClient())
  {
   try
   {
                                client.Timeout = TimeSpan.FromSeconds(30);
    HttpResponseMessage response = await client.GetAsync(uri);
    response.EnsureSuccessStatusCode();
    string responseBody = await response.Content.ReadAsStringAsync();

    Console.WriteLine(responseBody);
   }
   catch (HttpRequestException e)
   {
    Console.WriteLine("\nException Caught!");
    Console.WriteLine("Message :{0} ", e.Message);
   }
  }    
 }
    }
}

程式說明 : 
  • Line 17 : 建立 HttpClient用 using包起來確保物件使用後資源可以被完整釋放掉
  • Line 21 : 設定 Timeout 屬性,避免資源浪費
  • Line 22 : 透過 HttpClient GetAysnc 方法發送非同步請求 HTTP Get Request 到目標 uri,並將目標uri Response 結果存放在 HttpResponseMessage 
  • Line 23 , 28 : EnsureSuccessStatusCode 如果 Status Code 不為 2xx,會丟出HttpRequestException,會進到 Catch 處理寫 error log message
  • Line 24 , 26 : 非同步的方式取得 HTTP Response 的 Content,並 print 出來
執行結果 : 
  • 使用非同步方法,會先輸出 print Hit enter to exit.
  • 紅色框框部分為 uri 回傳內容

方式 2 - using SendAsync 

static async Task RunSendAsync()
{
 using (HttpClient client = new HttpClient())
 {
  HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Get, uri);

  await client.SendAsync(httpRequest)
   .ContinueWith(responseTask =>
   {
    Console.WriteLine("Response: {0}", responseTask.Result);
   });
 }   
}
程式說明 : 
  • Line 5 : 建立 HttpRequestMessage instance並指定HTTP Method 為 GET 和呼叫的 Uri
  • Line 7 : 透過 SendAysnc 方法將 HttpRequestMessage 內容作為參數發送非同步請求
  • Line 8 : 任務完成後要做的事情,類似 Javascript 中使用 Promise 處理非同步的寫法
  • Line 10 : 將 HTTP Response 結果印出來
執行結果 : 

HttpClient v.s WebClient 
在蒐集資訊過程中看到 stackoverflow 有篇文章 在討論兩者的比較
小弟針對有回答得大大做個小整理,如果有遺漏或是誤解請各位大大告知
  • HttpClient 是新的 API,對於非同步處理是優於 WebClient 
  • HttpClient 比 WebClient 更接近 HTTP
  • HttpClient 沒有要取代 WebClient,像是 WebClient 就支援 FTP 而 HttpClient 不支持
  • HttpClient 適用於 .Net Framework 4.5以上非同步功能WebClient 使用上簡單和簡潔
  • RestSharp 結合 HttpWebRequest 簡單好使用 (列入研究清單 !!! )

參考
HttpClient 類別
Deciding between HttpClient and WebClient
WebClient vs HttpClient vs HttpWebRequest
HttpClient is Here
使用 HttpClient 來存取 GET,POST,PUT,DELETE,PATCH 網路資源
C# HttpClient WebAPI : 2. 最簡單的方式使用 HttpClient 類別
理解并使用.NET 4.5中的HttpClient

2018年10月15日 星期一

[HTTP] HTTP GET、POST Method


HTTP

    Http(Hypertext Transfer Protocol)是一種通訊協定,用於網頁發出請求(Request)給伺服器,伺服器將要Render的資料回傳(Response)給網頁瀏覽器使用,Http訊息通常是透過80 port或是443 port(Secure http)往返網頁瀏覽器與伺服器之間。

    使用者在瀏覽器網址輸入URL(Uniform Resource Locator)、或是到google搜尋資料,在網頁上輸入想要搜尋的資訊,按下搜尋按鈕後,瀏覽器會發送命令(command)資訊到Web伺服器端,這裡面包含了請求的資源,如 QueryString參數、URL、要求路徑..等等資訊。發送一個請求(就是ASP.NET Application 概述提到的Request)到IIS,發送的訊息內容跟下面內容相似

1GET  /test.aspx  HTTP/1.1
2Host: www.google.com

Line 1:
  • GET:Http Method(告訴Web Server網頁要執行方法),一共分為9種(註一),常用的Get與Post方法包含在裡面
  • /test.aspx:這次要取回的URL網頁(目標網頁)
  • HTTP/1.1:通訊協定HTTP的版本
Line 2:
  • Host:Web Server 所使用的Host位置
註一:Http Method分為9種,分別為OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT、DEBUG,詳細可以參考Request Methods
     當Web Server處理完成瀏覽器發出的請求(Request)後會回傳以Response資訊(以文字為基礎)給使用者的瀏覽器,回傳資訊會類似下面文字

HTTP/1.1 200 OK
Server: Microsoft-IIS/6.0
Content-Type: text/html
Content-Length: 38
<html><body>Hello, world.</body><html>

Line 1:
  • HTTP/1.1:通訊協定HTTP的版本
  • 200:狀態代碼(Status Coe),為3位數組合
  • OK:解釋狀態代碼原因(Status Code Reason),HTTP/1.1版本中用很簡短文字來描述狀態代碼,200 OK 代表本次請求Web Server回應正常。
更詳細的可以參考:Status Code Definitions
Line 2:
  • 指出Web服務器的類型
Line 3:
  • MIME(Multipurpose Internet Mail Extensions)內容類型,MIME是由[type / subtype;種類/詳細類型]所組成;通常將網頁轉為 Word、Excel文件,就是修改這個屬性。
Line 4:
  • 內容長度
Line 5:
  • Content(表單內容)

 

GET

    在http通訊協定中,有兩種方法(HTTP methods)可以將資料送到Web Server端,分別是GET和POST,當使用GET的方法時,會將表單資訊附加在URL上並作為QueryString的一部分,QueryString是一種key/value的組合,從問號「?」開始,每一組值都是用「&」隔開,如下圖

    當使用GET方法將資料送到Web Server時,可以透過瀏覽器的網址看到完整的URL和QueryString,這是一種不安全的方法,具有高風險性。有心的人可以透過操控QueryString字串的方式來取得或破壞資料庫的資料,另一個缺點是有長度的限制,當使用MS IE和IIS的話,QueryString長度不能高過1,024個字元。舉例來說(有圖有真相),到yahoo搜尋輸入「hello world」,按下搜尋,此時我們可以透過httpwatch軟體來查看Get 方法Http Request封包的內容

從以上圖可以得知:
  1. HTTP Method 方法為 GET(廢話...大家又不是瞎子 XD),POST Data為空白
  2. 網址變http://tw.search.yahoo.com/search?p=hello+world&fr=yfp&ei=utf-8&v=0,透過QueryString方式傳遞資料給Web Server。
  3. 從網址列就可以看出表單傳送的資料(QueryString),假設是傳送機密性資訊的話,不就被看光光了,這也是前面所提到安全性的問題。

 

POST

    POST方法是將要傳送的資訊放在message-body中,如下圖

    使用POST方法就不用擔心資料大小的限制,可以防止使用者操作瀏覽器網址,表單的資料被隱藏在message-body中,因此,在大多數的情況下,使用POST方法將表單資料傳到Web Server端是更有效的方法。同樣的,我們也可以透過httpwatch觀察POST 方法Http Request封包的內容

從以上圖可以得知:
  1. HTTP Method 方法為 POST
  2. POST Data資料(value)不為空白;透過POST Data方式傳遞資料給Web Server。

比較

    透過表格的方式,簡單比較一下「GET」和「POST」兩者的差異

從表中可以看出來,GET與POST方法各有優點和缺點
  • GET方法執行速度比較快但是安全性較差
  • POST方法速度較慢(因為要將Form的資料一送回Web Server),安全性較GET高
沒辦法說哪種方法最好或最壞,但可以透過不同的應用或需求使用較為適合的方法;當單純的呈現網頁資料,使用GET方法;當網頁上的資料是動態產生控件的話,就建議使用POST方法;個人淺見,有錯請各位給予指教 :p

參考

此篇文章是上網查詢自己整理的結果,如果內容有錯誤的地方,麻煩各位高手給予小弟指導
如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,謝謝 :D

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com