Windows Mobileから.NET Compact FrameworkでTwitterにアクセスしてみました。作成したものをソース付きで公開します。
以下にハマったポイントなどを書いておきます。
ログ取得
- .NET Compact FrameworkにはWebClientがないので、HttpWebRequestを使用します。
- IDとパスワードで認証しないといけませんが、なぜかHttpWebRequest.Credentialsではうまくいきません。PreAuthenticateを指定してもダメです。
- 自前でBasic認証のヘッダを生成して対処しました。
var url = "http://twitter.com/statuses/user_timeline.xml"; var req = HttpWebRequest.Create(url); req.Method = "GET"; var auth = Encoding.ASCII.GetBytes("id:password"); req.Headers.Add("Authorization: Basic " + Convert.ToBase64String(auth)); req.BeginGetResponse(...);
BeginGetResponse()以下は通常のサンプルコード等と同じなので省略します。
URLEncode
.NET Compact FrameworkにはHttpUtility.UrlEncodeがないため、自前で実装しました。
public static string URLEncode(string text) { var sb = new StringBuilder(); foreach (char ch in Encoding.UTF8.GetBytes(text)) { if (ch < 128 && char.IsLetterOrDigit(ch)) sb.Append(ch); else { switch (ch) { case ' ': sb.Append('+'); break; case '-': case '_': case '.': sb.Append(ch); break; default: sb.Append(string.Format("%{0:X2}", (int)ch)); break; } } } return sb.ToString(); }
書き込み
- POSTデータを送信する際に、Windows XP上の.NET Compact FrameworkではHttpWebRequest.BeginGetRequestStream()が正常に機能しましたが、Windows Mobile上では正常に機能しませんでした。
- URLにクエリとして付加することで対処しました。
var url = "http://twitter.com/statuses/update.xml"; var text = "書き込みテスト"; var req = HttpWebRequest.Create(url + "?status=" + URLEncode(text)); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; var auth = Encoding.ASCII.GetBytes("id:password"); req.Headers.Add("Authorization: Basic " + Convert.ToBase64String(auth)); req.BeginGetResponse(...);
BeginGetResponse()以下は通常のサンプルコード等と同じなので省略します。
今回はクエリで代用しましたが、この方法で回避できないケースもあると思います。そのためPOSTのどこで失敗しているか等を調査する必要がありそうです。