Windows Phone 7 plurk App
摘要:Windows Phone 7 plurk App 用Windows Phone 7 写网络应用程序一定要先研究 http 相关的运行,写一个 plurk API 应用应该是最简单的。 当然,我早就写过 plurk API 的程序了,公司的网页每天也一直用 plurk 发布新的消息,所以在这里 plurk API 不是重点,重点是 http 。
而最常用、最简单的 http 大家一定都会想到 WebClient,所以打开 Visual Studio 2010 Express for Windows Phone ,拉好 TextBox 和 Button,就开始写了..... WebClient client = new WebClient();
首先,plurk login 要用 https,很抱歉,WebClient要跑https 通常会先加一行 ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 呃.......怎么打下去后下面多一条红线!?!?!?
马上下手 public partial class MainPage : PhoneApplicationPage { WebClient client = new WebClient(); public MainPage() { InitializeComponent(); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); client.DownloadStringAsync(new Uri("http://www.plurk.com/API/Users/login?api_key=XXX&username=YYY&password=ZZZ")); } void client_DownloadStringCompleted(object sender,DownloadStringCompletedEventArgs e) { textBox1.Text = e.Result; } } 嘿嘿~~ 看到东西了
我不知道为什么 HTTP 可以执行,反正他就是过了,让我登入了,所以第一步成功了,接下来要做发噗的功能。 写到这里顺便提一下,我想要让 TextBox可以断行的功能,在这里找到了灵感,我融合了三造的建议,写下了? TextWrapping="Wrap" 和 ?AcceptsReturn="True" 才让 TextBox 有 Multiline 的模式,感谢他们。
再来,发噗必先有 Cookie,所以我在? DownloadStringCompleted 那行之前很帅气的写了一行 string cookie = client.ResponseHeaders["Set-Cookie"].Split(‘;‘)[0]; 因为这行是凭借着多年的经验才能直觉反应的不经思考的非常帅气的找到以前写好的project轻松的copy过来。 但,很快的,我发现这行没用................
我只在DownloadStringCompleted 前加一行刚得到的 Cookie而已就给我这个画面..... Or22 client.Headers["Cookie"] = "plurkcookiea="p/SFAL9Fy4qo7s.............."; 他给我这个错误:"The ‘Cookie‘ header cannot be modified directly.rnParameter name: name" 心情非常沮丧,此时这篇文章已经写了快一星期了.....唉....... 看样子,WebClient ?1:不支持SSL,2:不支持 Cookie,3:不支持同步...... 啥米碗糕....我想放弃了... ~>"<~ 网络上好像找不到Wp7 这个Exception的解法,只看到WebClient是base on XMLHttpRequest 所以不支持 Cookie,很抱歉,我真的完全不懂..... 除了这个以外,这当中还碰过Concurrent I/O operations exception 看来开发wp7的路途可能相当艰辛。
ok....山不转路转,改用 HttpWebRequest 可以了吧..... 这里面也牵涉到Cross Thread的问题,又花了相当的时间,在睡眼惺忪的情况下写下了下面这段code //因为这里已经不会回传任何东西了,所以设void public void GetPage(String url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.CookieContainer = new CookieContainer(); //全域变量 Cookie cookie; if (cookie != null) request.CookieContainer.Add(new Uri(url),cookie); request.Method = "GET"; request.BeginGetResponse(delegate(IAsyncResult ar) { //异步得到Response using (WebResponse response = request.EndGetResponse(ar)) { //全域变量 string status; if (status == "login") { cookie = request.CookieContainer.GetCookies(request.RequestUri)["plurkcookiea"]; //跨执行续执行变更TextBox.Text textBox2.Dispatcher.BeginInvoke(()=>{ textBox2.Text = "welcome"; }); } } },null); }
这过程中又经过了三天三夜了也历经过许多问题....包含UrlEncode 的问题可以用 System.Uri.EscapeUriString 代替。 还有遇到奇怪的问题,他说要把?
奇迹!!!!! 我出运了!!!!!!! 他发噗了!!!!!!! ?
?(TO EVERY LITTLE GOOD THING IN LIFE,?.............. Cheers! )
后来再 Review 一下 code,其实?HttpWebRequest 也可以用 https,直接把 http 改 https 就好了, 再回去看 WebClient,也一样,也适用,完全不需要顾虑什么,也不需要加其他程序,直接打https就对了。 这是中断时查看 request.RequestUri.Port 跑 80还是443。
说也奇怪,我把刚刚的dess副文件名改回去,也没发生什么错误了,难道一切都是............. Ok! 接下来还有一大段路要走,包含 利用 json2XML 查看、回复朋友的噗,还有上传照片....等噗浪其他功能,我现在已经没有体力再写下去了....改天吧!!!
范例下载: ?? ? ??
ps1: plurk 的 api_key 需要自行申请 ps2: Or22 是 OTZ 的 3D版 ps3: WindowsPhoneApplication7.zip 真的是 Version 7 ps4:以上可能会在 2010/9/16 以后不适用 (编辑:ASP站长网) |