【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

.NET Compact FrameworkでTwitter

n7shi2008-05-11


Windows Mobileから.NET Compact FrameworkでTwitterにアクセスしてみました。作成したものをソース付きで公開します。

以下にハマったポイントなどを書いておきます。

ログ取得

  1. .NET Compact FrameworkにはWebClientがないので、HttpWebRequestを使用します。
  2. IDとパスワードで認証しないといけませんが、なぜかHttpWebRequest.Credentialsではうまくいきません。PreAuthenticateを指定してもダメです。
  3. 自前で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();
} 

書き込み

  1. POSTデータを送信する際に、Windows XP上の.NET Compact FrameworkではHttpWebRequest.BeginGetRequestStream()が正常に機能しましたが、Windows Mobile上では正常に機能しませんでした。
  2. 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のどこで失敗しているか等を調査する必要がありそうです。