使用RX方式模拟DoubanFm的登陆
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/loginMethod:
POSTArguments:
app_name:radio_desktop_winversion:100email:用户帐号password:明文密码
Header:
Content-Type: application/x-www-form-urlencodedResponse (
application/json)
在WP7下的Post过程大致如下(Get过程相对简单,只需要2步):
第一步:
public void PostMethod(string Url,string Postdata)
{ HttpWebRequest request;
request = (HttpWebRequest)WebRequest.Create(new Uri(Url));
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.BeginGetRequestStream(new AsyncCallback(RequestCallback), request); _postdata = Postdata;
}
第二步:
private void RequestCallback(IAsyncResult asyncResult)
{
HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
UTF8Encoding encoding = new UTF8Encoding();
Stream _body = request.EndGetRequestStream(asyncResult);
byte[] formBytes = encoding.GetBytes(_postdata);//这是通过post方式传的
_body.Write(formBytes, , formBytes.Length);
_body.Close();
request.BeginGetResponse(new AsyncCallback(ResponseCallback), request); }
第三步:
private void ResponseCallback(IAsyncResult asyncResult)
{
HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; WebResponse httpwebresponse = request.EndGetResponse(asyncResult);
Stream stream= httpwebresponse.GetResponseStream();
StreamReader reader = new StreamReader(stream);
string result=reader.ReadToEnd(); // Deployment.Current.Dispatcher.BeginInvoke(_postret, result); }
刚学习了Rx,想看看如果用Rx应该怎么做
先来回顾下Rx 如下
public interface IObservable<T> { IDisposable Subscribe(IObserver<T> observer); }
public interface IObserver<T>
{
void OnCompleted();
void OnError(Exception exception);
void OnNext(T value);
}
在我的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>的注册方式:
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (onNext == null)
{
throw new ArgumentNullException("onNext");
}
return source.Subscribe(new AnonymousObserver<T>(onNext, Stubs.Throw, Stubs.Nop));
}
具体实现我们不具体去关注,但是我们知道在11行,是New了一个匿名的观察者Observer了。
接下来看看FromAsyncPattern
public static Func<IObservable<TResult>> FromAsyncPattern<TResult>(Func<AsyncCallback, object, IAsyncResult> begin, Func<IAsyncResult, TResult> end)
这是个静态方法,返回一个返回值类型为IObservable<TResult>,无实参,的委托
先回顾用Rx实现的一个Get方法:
public LoginTest()
{ var func= Observable.FromAsyncPattern<HttpWebRequest,HttpWebResponse>(Webrequest,WebResponse);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.baidu.com"); var observable= func(request);
observable.Subscribe(
(result) =>
{
var stream = result.GetResponseStream();
var sr = new StreamReader(stream);
var baiduhttphtml = sr.ReadToEnd();
}); } IAsyncResult Webrequest(HttpWebRequest request,AsyncCallback callbcak,object ob)
{
return request.BeginGetResponse(callbcak, request);
}
HttpWebResponse WebResponse(IAsyncResult result)
{
var request = result.AsyncState as HttpWebRequest;
return (HttpWebResponse)request.EndGetResponse(result);
}
这样的Get方式看起来很简洁
昨晚敲了一下,Post方式如下:(回去后在VS2013上用RX,发现他提示我最好用await,Task等新特性来做异步,今晚回去试试,实验室是VS2010)
class MyHttpRequest
{
string PostData;
AsyncCallback save;//用于中间传递
public IObservable<string> PostMethod(string URL, string PostData)
{
this.PostData = PostData;
var func = Observable.FromAsyncPattern<HttpWebRequest,string>(Webrequest, ResponseCallback);//直接返回string
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
return func(request); }
IAsyncResult Webrequest(HttpWebRequest request, AsyncCallback callbcak, object ob)
{
save = callbcak;//保存CallBack
return request.BeginGetRequestStream(act, request);
}
void act(IAsyncResult asyncResult)
{
HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
UTF8Encoding encoding = new UTF8Encoding();
Stream _body = request.EndGetRequestStream(asyncResult);
byte[] formBytes = encoding.GetBytes(this.PostData);//这是通过post方式传的
_body.Write(formBytes, , formBytes.Length);
_body.Close();
request.BeginGetResponse(save, request);//用保存的CallBack }
string ResponseCallback(IAsyncResult asyncResult)
{
HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
WebResponse httpwebresponse = request.EndGetResponse(asyncResult);
Stream stream = httpwebresponse.GetResponseStream();
StreamReader reader = new StreamReader(stream);
return reader.ReadToEnd();
}
}
好了,现在很清楚了,来试试效果
public LoginTest()
{
//发出一个消息 跟MVVMLight Messenger有点像
var observable= new MyHttpRequest().PostMethod("http://www.douban.com/j/app/login", "app_name=radio_desktop_win&version=100&email=327442095@qq.com&password="); //直接在这里订阅一个匿名接收者
observable.Subscribe((result) =>
{
Debug.WriteLine(result);
});
Debug.WriteLine("我比你先返回,哈哈");
}

~OK。
可以使用这个方式做我的FM登陆了。
使用RX方式模拟DoubanFm的登陆的更多相关文章
- 使用Telerik的登陆模板实现DoubanFm的登陆(WP7)
Telerik的控件很强大.我们直接使用其登陆模板. 在装过Telerik WP版后,就可以在VS里非常方便的添加页面了. 我们选择 Sign In Form 其XAML不是很长,直接贴出来 < ...
- [PHP自动化-进阶]004.Snoopy VS CURL 模拟Discuz.net登陆
引言:采集论坛第一步就是要模拟登陆,由于各个站点登录表单各不相同,验证方式又是多种多样,所以直接提交用户名密码到登录页面就比较繁琐. 所以我们采用cookie来模拟登陆无疑是最佳捷径. 今天我们要处理 ...
- HttpClient方式模拟http请求
方式一:HttpClient import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.http.*; im ...
- HttpClient方式模拟http请求设置头
关于HttpClient方式模拟http请求,请求头以及其他参数的设置. 本文就暂时不给栗子了,当作简版参考手册吧. 发送请求是设置请求头:header HttpClient httpClient = ...
- C# Winform利用POST传值方式模拟表单提交数据(Winform与网页交互)
其原理是,利用winfrom模拟表单提交数据.将要提交的參数提交给网页,网页运行代码.得到数据.然后Winform程序将网页的全部源码读取下来.这样就达到windows应用程序和web应用程序之间传參 ...
- 使用HttpWebrequest对网站进行模拟操作(附登陆百度demo)
// a[href=#viewSource]"); //查看源代码标签 viewSourceArr.attr("title", "查看源代码"); v ...
- 2016C#模拟谷歌Google登陆Gmail&Youtube小案例
之所以写这个,是因为本来想写一个Youtube刷评论的工具,把登录做出来了,后面就没继续做下去. 涉及到基本的HttpWatch的应用以及Fiddler的应用(Fd主要用来排查问题,通过对比 浏览器和 ...
- Android+struts2+json方式模拟手机登录功能
涉及到的知识点: 1.Struts2框架的搭建(包括Struts2的jSON插件) 2.Android前台访问Web采用HttpClient方式. 3.Android采用JSON的解析. 服务端主要包 ...
- 单元测试,模拟用户Get登陆,并携带登录后的token访问接口
HttpClient _httpClient; HttpClient _businessHttpClient; private async Task<string> GetAccessTo ...
随机推荐
- django 用imagefiled访问图片
使用FileField和ImageField时,我们有几个步骤: 在settings.py中设置MEDIA_ROOT和MEDIA_URL MEDIA_ROOT:一个绝对路径,Django根据它知道文件 ...
- 手机端Post 数据
var data =""; using (StreamReader readStream = new StreamReader(context.Reques ...
- 跨域 HTTP 请求
如果你需要从不同的服务器(不同域名)上获取数据就需要使用跨域 HTTP 请求. 跨域请求在网页上非常常见.很多网页从不同服务器上载入 CSS, 图片,Js脚本等. 在现代浏览器中,为了数据的安全,所有 ...
- hdu 4118 树形dp
思路:其实就是让每一条路有尽量多的人走. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<m ...
- Android 使用动态加载框架DL进行插件化开发
http://blog.csdn.net/t12x3456/article/details/39958755/ 转载自: 时之沙: http://blog.csdn.net/t12x3456
- 转 【O2O案例】汽车后市场垂直化电子商务:平业模式解析
核心提示:一.商业模式简介.汽车后市场垂直化电子商务是我在2010年初开始筹划,起因是在淘宝工作期间运营汽车类目后遇到很多问题无决,由于 一.商业模式简介. 汽车后市场垂直化电子商务是我在2010年初 ...
- Struts2基本包作用详解
asm-3.3.jar作用:操作java字节码的类库包路径及主要类:未提供 asm-commons-3.3.jar作用:提供了基于事件的表现形式包路径及主要类:未提供 asm-tree-3.3.jar ...
- [转] 正则表达式 oracle
地址:http://www.cnblogs.com/Azhu/archive/2012/04/03/2431127.html 从oracle database 10gsql 开发指南中copy的. 正 ...
- iOS-设置启动图片
启动图片设置 设置方法一 这种方法里,默认模拟器和真机的尺寸和启动图片的尺寸相同. 通过美工提供各种尺寸的启动图片来适配屏幕的大小.这种方法要求美工提供各种屏幕大小的图片. 步骤如下: 1.如图所示, ...
- 编程Tips
三元运算符 Vb中的iif(expr,truepart,falsepart)和C#中的expr?truepart:falsepart. 无论expr的结果是true还是false,true/false ...