WP7下的Get Post都是异步的

关于RX

http://www.cnblogs.com/yangecnu/archive/2012/11/03/Introducting_ReactiveExtensions.html

我初步理解的Rx,是观察者模式的一种实现

Url很简单,先来看看URL

  • URL: http://www.douban.com/j/app/login

  • Method: POST

  • Arguments:

    • app_nameradio_desktop_win

    • version100

    • email用户帐号

    • password明文密码

  • Header: Content-Type: application/x-www-form-urlencoded

  • Response ( application/json )

在WP7下的Post过程大致如下(Get过程相对简单,只需要2步):

第一步:

 1     public void PostMethod(string Url,string Postdata)
 2         {
 3
 4             HttpWebRequest request;
 5             request = (HttpWebRequest)WebRequest.Create(new Uri(Url));
 6             request.Method = "POST";
 7             request.ContentType = "application/x-www-form-urlencoded";
 8             request.BeginGetRequestStream(new AsyncCallback(RequestCallback), request);10             _postdata = Postdata;
11         }

第二步:

 1    private void RequestCallback(IAsyncResult asyncResult)
 2         {
 3            HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
 4             UTF8Encoding encoding = new UTF8Encoding();
 5             Stream _body = request.EndGetRequestStream(asyncResult);
 6             byte[] formBytes = encoding.GetBytes(_postdata);//这是通过post方式传的
 7             _body.Write(formBytes, 0, formBytes.Length);
 8             _body.Close();
 9             request.BeginGetResponse(new AsyncCallback(ResponseCallback), request);
10
11          }

第三步:

 1      private void ResponseCallback(IAsyncResult asyncResult)
 2         {
 3             HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
 4
 5                     WebResponse httpwebresponse = request.EndGetResponse(asyncResult);
 6                     Stream stream=   httpwebresponse.GetResponseStream();
 7                     StreamReader reader = new StreamReader(stream);
 8                     string result=reader.ReadToEnd();
 9
10             // Deployment.Current.Dispatcher.BeginInvoke(_postret, result);
11
12         }

刚学习了Rx,想看看如果用Rx应该怎么做

先来回顾下Rx 如下

public interface IObservable<T>  {  IDisposable Subscribe(IObserver<T> observer); }

1    public interface IObserver<T>
2     {
3         void OnCompleted();
4         void OnError(Exception exception);
5         void OnNext(T value);
6     }

在我的System.Reactive.Linq的Observable静态类下,定义了了IObservable<T>的很多扩展方法,

    public static IObservable<TResult> Select<TSource, TResult>(this IObservable<TSource> source, Func<TSource, TResult> selector)

  public static IObservable<TResult> SelectMany<TSource, TResult>(this IObservable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)

这些扩展方法反映了我们可以像Linq一样获得一个IObservable<T>

下面是获得一个IObservable<T>的最简单的方法

  public static IObservable<TResult> Return<TResult>(TResult value)

用这个方法得到的IObservable<T>后就可以注册了,在我的System.Reactive.Core.dll,System命名空间下的ObservableExtensions静态类扩展了IObservable<T>的注册方式:

 1  public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext)
 2         {
 3             if (source == null)
 4             {
 5                 throw new ArgumentNullException("source");
 6             }
 7             if (onNext == null)
 8             {
 9                 throw new ArgumentNullException("onNext");
10             }
11             return source.Subscribe(new AnonymousObserver<T>(onNext, Stubs.Throw, Stubs.Nop));
12         }

具体实现我们不具体去关注,但是我们知道在11行,是New了一个匿名的观察者Observer了。

接下来看看FromAsyncPattern

  public static Func<IObservable<TResult>> FromAsyncPattern<TResult>(Func<AsyncCallback, object, IAsyncResult> begin, Func<IAsyncResult, TResult> end)

这是个静态方法,返回一个返回值类型为IObservable<TResult>,无实参,的委托

先回顾用Rx实现的一个Get方法:

 1   public LoginTest()
 2         {
 3
 4          var func=  Observable.FromAsyncPattern<HttpWebRequest,HttpWebResponse>(Webrequest,WebResponse);
 5          HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.baidu.com");
 6
 7         var observable= func(request);
 8         observable.Subscribe(
 9             (result) =>
10             {
11                 var stream = result.GetResponseStream();
12                 var sr = new StreamReader(stream);
13                 var baiduhttphtml = sr.ReadToEnd();
14             });
15
16         }
17
18         IAsyncResult Webrequest(HttpWebRequest request,AsyncCallback callbcak,object ob)
19         {21             return request.BeginGetResponse(callbcak, request);
22         }
23         HttpWebResponse WebResponse(IAsyncResult result)
24         {
25             var request = result.AsyncState as HttpWebRequest;
26           return (HttpWebResponse)request.EndGetResponse(result);
27         }

这样的Get方式看起来很简洁

昨晚敲了一下,Post方式如下:(回去后在VS2013上用RX,发现他提示我最好用await,Task等新特性来做异步,今晚回去试试,实验室是VS2010)

 1  class MyHttpRequest
 2         {
 3             string PostData;
 4             AsyncCallback save;//用于中间传递
 5             public  IObservable<string> PostMethod(string URL, string PostData)
 6             {
 7                 this.PostData = PostData;
 8                 var func = Observable.FromAsyncPattern<HttpWebRequest,string>(Webrequest, ResponseCallback);//直接返回string
 9                 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
10                 request.Method = "POST";
11                 request.ContentType = "application/x-www-form-urlencoded";
12               return  func(request);
13
14             }
15             IAsyncResult Webrequest(HttpWebRequest request, AsyncCallback callbcak, object ob)
16             {
17                 save = callbcak;//保存CallBack
18                 return request.BeginGetRequestStream(act, request);
19             }
20             void act(IAsyncResult asyncResult)
21             {
22                 HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
23                 UTF8Encoding encoding = new UTF8Encoding();
24                 Stream _body = request.EndGetRequestStream(asyncResult);
25                 byte[] formBytes = encoding.GetBytes(this.PostData);//这是通过post方式传的
26                 _body.Write(formBytes, 0, formBytes.Length);
27                 _body.Close();
28                 request.BeginGetResponse(save, request);//用保存的CallBack
29
30             }
31             string ResponseCallback(IAsyncResult asyncResult)
32             {
33                 HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
34                 WebResponse httpwebresponse = request.EndGetResponse(asyncResult);
35                 Stream stream = httpwebresponse.GetResponseStream();
36                 StreamReader reader = new StreamReader(stream);
37                 return reader.ReadToEnd();
38             }
39         }

好了,现在很清楚了,来试试效果

 1     public LoginTest()
 2         {
 3             //发出一个消息 跟MVVMLight Messenger有点像
 4         var observable=    new MyHttpRequest().PostMethod("http://www.douban.com/j/app/login", "app_name=radio_desktop_win&version=100&email=327442095@qq.com&password=");
 5
 6
 7             //直接在这里订阅一个匿名接收者
 8         observable.Subscribe((result) =>
 9             {
10                 Debug.WriteLine(result);
11             });
12         Debug.WriteLine("我比你先返回,哈哈");
13         }

~OK。

可以使用这个方式做我的FM登陆了。

转载于:https://www.cnblogs.com/07lyt/p/3973906.html

使用RX方式模拟DoubanFm的登陆相关推荐

  1. 使用Telerik的登陆模板实现DoubanFm的登陆(WP7)

    Telerik的控件很强大.我们直接使用其登陆模板. 在装过Telerik WP版后,就可以在VS里非常方便的添加页面了. 我们选择 Sign In Form 其XAML不是很长,直接贴出来 1 &l ...

  2. libcurl模拟hi百度登陆

    题外话: 话说某大型论坛,每天都有不少网友瞄准00.00发表文章,争取拿到当天第一签.某牛某天兴致大发,在Linux下,利用crond定时在00:00运行一个shell脚本程序来发表文章,于是日日得到 ...

  3. python--支付密码的验证、模拟qq账号登陆、商品价格竞猜(radom随机数的使用)、根据星座产看运势​

    支付密码的验证 pwd=input('支付宝支付密码:') if pwd.isdigit():#此内置函数用来判断输入的字符串是否是数字print('支付的数据合法') else:print('支付数 ...

  4. socket模拟http的登陆_Python网络爬虫之模拟登陆 !

    为什么要模拟登陆? Python网络爬虫应用十分广泛,但是有些网页需要用户登陆后才能获取到信息,所以我们的爬虫需要模拟用户的登陆行为,在登陆以后保存登陆信息,以便浏览该页面下的其他页面. 保存用户信息 ...

  5. .net下模拟不同身份登陆以获取不同权限

    .net下模拟不同身份登陆以获取不同权限   1.net下模拟不同身份登陆以获取不同权限     2    3作者:佚名 时间:2004-04-16 09:14 出处:互连网 责编:chinaitpo ...

  6. php 模拟客户端访问,PHP通过伪造和模拟客户端COOKIE登陆来采集抓取远程网址

    平时开发中经常会遇到抓取某个页面内容,但是有时候某些页面需要登陆才能访问,最常见的就是论坛,这时候我们需要来使用curl模拟登陆. 以下讨论的是和伪造模拟客户端COOKIE登陆采集抓取远程网址相关的P ...

  7. (Java-17)简单模拟账号密码登陆

    在main方法中,我们经常用以下代码: public class ArrayTest {public static void main(String[] args) { main方法由JVM负责调用, ...

  8. 模拟一个“系统登陆“窗体,进行用户名和密码的验证: 1.当用户名和密码都正确时,弹出一个对话框,提示“用户名和密码正确”, 2.用户名错误,弹出一个对话框,提示“用户名错误,请重新输入!”

    模拟一个"系统登陆"窗体,进行用户名和密码的验证: 1.当用户名和密码都正确时,弹出一个对话框,提示"用户名和密码正确", 2.用户名错误,弹出一个对话框,提示 ...

  9. python做的游戏放到微信_【1、 创建一个python的文件,运行后,文字版方式模拟微信游戏“跳一跳?】...

    python脚本学习过程推荐 学习流程: 一:打础 1.找到合适的书籍(推荐Python核心编程2Dive into Python),大致读一次,循环啊判,常用类啊,搞懂(太难的跳过) 2.勤练习py ...

最新文章

  1. Java并发编程,无锁CAS与Unsafe类及其并发包Atomic
  2. qt5.6.3版本移植arm
  3. html表格统计表,jQuery操作表格(table)的常用方法、技巧汇总
  4. Linux 命令执行顺序控制
  5. Android应用中使用及实现系统“分享”接口
  6. cordova与android通信_使用Cordova插件实现两个app之间的相互调用和通讯
  7. 写字机器人制作教程 midt-bot
  8. 直播 | 2017阿里双11在线技术峰会
  9. IOS设置时间不兼容解决方案
  10. 三步完整实现运放负反馈电路稳定性设计
  11. 机器学习常用数据处理
  12. 七牛云的免费SSL证书申请和用法
  13. 京东api接入的几个坑(宙斯) 转载
  14. 写在回家前的最后一夜
  15. STM8开发实例-时钟系统(CLK)
  16. 【webots教程】简单的避障机器人
  17. mongo3.0.9库命名的一个S级bug
  18. 用qq邮箱,以阿里邮箱的名义发出邮件
  19. 股票多因子模型之截面回归
  20. 蓝桥杯历届-巧排扑克牌

热门文章

  1. linux sd卡 分区变大,Linux下使用fdisk命令将高容量SD卡(SDHC)格成两个分区
  2. Tikhonov正则化方法在测绘领域的综述
  3. PXIe,PXI,CPCI相互区别和关系,总线之间,几种机箱之间是否兼容?
  4. 日期偏移INTERVAL * DAY
  5. MySQL之——优化篇
  6. Oracle 11gR2 RSF(Recurive Subquery factoring)
  7. 基于OpenCV实现简单人脸面具、眼镜、胡须、鼻子特效(详细步骤 + 源码)
  8. 华为+android+root权限获取root,[Android]如何获取华为手机的root权限
  9. Leetcode算法Java全解答--37. 解数独
  10. Jmeter - 从入门到精通高级篇 - jmeter使用监视器结果监控tomcat性能(详解教程)