緣起:
接續這篇,今天上午弄好 signature 後,下午接著繼續研究怎麼用 C# 把我的那些 OAuth 資料送到 Twitter API 那邊,過程還算順利,只有一個地方卡比較久,就是沒把 hash 出來的值做 base64 的編碼,導致在傳 http 時一直出現 401 的 Exception。
HttpWebRequest:
首先是要怎麼傳 http 的資料過去,這個我兩天前其實就有先稍微試過了,看這篇文章的教學。這個類別在 System.Net 下面
使用 WebRequest 的 Create 方法,裡面傳入目標網址的字串,我們的目標是 "https://api.twitter.com/2/tweets"。可以透過 Headers 欄位來設定 Request 的 Header 值,存取的方式很像字典,是 key value 對,最重要的是設定 Authorization 的屬性。Method 可以設定 POST 或 GET,ContentType 就 "application/json",Timeout 是逾時的時間(毫秒)。
要在 Body 裡寫資料的話會需要用到 StreamWriter 這個類別,讀回應的資料要用 StreamReader,需要引用 System.IO。HttpWebRequest 有 GetRequestStream 方法,回傳的 Stream 可以用來初始化 StreamWriter 類別,然後就能用 StreamWriter 的 Write 方法就可以寫東西到我們 Request 的 Body 裡了。
讀取 Response 接著寫在下面,格式很像,HttpWebRequest 一樣有個 GetResponseStream 的方法來得到 Response 的 Stream,然後我們再用 StreamReader 的 ReadToEnd 方法讀取完整的回應。
差不多就這樣。
TimeStamp 跟 Nonce:
我們在 POST Man 上面使用 Twitter API 時,OAuth1.0 需要的 Nonce 跟 TimeStamp 是 POST Man 幫我們產生的,在 C# 上面我們需要自己寫個程式來產生。
首先是 Nonce,看了看官方文件的說法,它是讓 Twitter 識別某個 request 是否被重送,每個 requst 應該都要有一個獨一無二的 Nonce。雖然文件是說那個值是基於 base64 32bytes 的資料,不過只要能每次都產生不重複的字母串,你用其它的方式也行,長度不一定要跟他一樣。
說到產生不重複的字串,我想到我在看公司的程式碼時,好像有看到一個叫 GUID 的類別,他的功能感覺能滿足我的需求,所以就去查看了微軟的文件。
它使用起來超簡單,只要呼叫 GUID.NewGUID(),然後再呼叫 toString() 轉成字串就OK了,我們就能拿到一串獨一無二的字母串。
長這樣 |
再來是 TimeStamp,跟時間有關的東西,好像就 1970 年 1 月 1 號到現在經過的毫秒數 (Unix系統),這個也查一下就有了,直接複製貼上使用。
產生 Authorization:
這部份就觀察 POST Man 的 Header 格式就行
送出資料:
我把整個步驟都包成一個 Tweet 的 function,這邊要注意的就,送出的資料格式是 json。
沒有留言:
張貼留言