TwitterのOAuthリクエスト用パラメーターを準備する

この記事は以下の環境が対象です:

この記事のコードはTwitter APIのドキュメントの他に以下の2つのコードを参考にさせて頂きました。

Twitter APIに対してOAuthの認証を要求したり認証済みのリクエストを送る場合、さまざまなパラメーターを1つの文字列として連結してリクエストに含める必要がありますが、この際すべてのパラメーターのキーと値をパーセントエンコードしてアルファベット順に連結する必要があります。

と言うことで、プログラム内で取得したパラメーターはすべて事前にパーセントエンコードしてSortedDictionaryに入れておくのが楽かなぁと思い、以下のようにしてみました。

/// <summary>
/// パラメーター名および値をパーセントエンコードしてディクショナリに追加
/// </summary>
private void AddPercentEncodedItem(SortedDictionary<string, string> dictionary, string key, string keyValue)
{
	dictionary.Add(Uri.EscapeDataString(key), Uri.EscapeDataString(keyValue));
}

ちなみに、.Net FrameworkUri.EscapeDataStringメソッドは4.0までは問題がある(IRIを有効にしてもRFC 3986に準拠できない?)ようでTwitter APIの仕様であるRFC 3986に準拠したエンコーディングが行えないようで独自に実装する方法が主流のようです。

.NET Framework 4.5ではこの問題は解決されているようで、特に意識せずUri.EscapeDataStringを使用してリクエストを生成することができました。

使用例:

//パラメーターディクショナリの作成
SortedDictionary<string, string> paramDictionary = new SortedDictionary<string, string>();

//パラメーターの追加
AddPercentEncodedItem(paramDictionary, _pName_oauth_consumer_key, _oauth_consumer_key);
AddPercentEncodedItem(paramDictionary, _pName_oauth_nonce, GenerateNonce());
AddPercentEncodedItem(paramDictionary, _pName_oauth_signature_method, "HMAC-SHA1");
AddPercentEncodedItem(paramDictionary, _pName_oauth_timestamp, GenerateTimeStamp());
AddPercentEncodedItem(paramDictionary, _pName_oauth_token, oauth_token);
AddPercentEncodedItem(paramDictionary, _pName_oauth_version, "1.0");

//シグネチャを生成しパラメーターに追加
string signature = GenerateSignature(paramDictionary, _updateStatusUrl, oauth_token_secret);
AddPercentEncodedItem(paramDictionary, _pName_oauth_signature, signature);