Fluent Interface for WebRequest class
2011-08-09 12:53 Fred-Xu 阅读(526) 评论(2) 编辑 收藏 举报以前,我经常使用WebRequest来获取远程端的数据,我也使用它来从Google APIs获取JSON数据,从其他一些远程端获取RSS、ATOM数据,一切都很正常,我只是这样来写代码:
var buffer = Encoding.ASCII.GetBytes("q=Queen Elizabeth II&video=on&audio=on&text=on"); var webReq = (HttpWebRequest)WebRequest.Create("http://www.bbc.co.uk/search/news/"); webReq.Method = "POST"; webReq.ContentType = "application/x-www-form-urlencoded"; webReq.ContentLength = buffer.Length; var postData = webReq.GetRequestStream(); postData.Write(buffer, 0, buffer.Length); postData.Close(); var webResp = (HttpWebResponse)webReq.GetResponse(); var answer = webResp.GetResponseStream(); var result = string.Empty; if (answer != null) { using (var tempStream = new StreamReader(answer)) { result = tempStream.ReadToEnd(); } }
这段代码使用Post方法和GET方法,我们经常这么使用它:
const string getVars = "?q=Queen Elizabeth II&video=on&audio=on&text=on"; var webReq = (HttpWebRequest)WebRequest.Create(string.Format("http://www.bbc.co.uk/search/news/{0}", getVars)); webReq.Method = "GET"; var webResp = (HttpWebResponse)webReq.GetResponse(); var answer = webResp.GetResponseStream(); var result = string.Empty; if (answer != null) { var tempStream = new StreamReader(answer); result = tempStream.ReadToEnd(); }
这段代码可以使用,没有问题。WebRequest 类非常酷。但是我们使用 Fluent Interface 让它更加棒,易读更具语义。Fluent Interface非常适合这个case,我们可以使这段代码更有意思。我喜欢优美的代码,怎样让代码来表达它自己。你觉得这段代码酷吗?
var result = RequestSubmitter.GetInstance() .WithUrl("http://www.bbc.co.uk/search/news/") .Item.WithNameIs("q").ValueIs("Queen Elizabeth II") .ConnectWith.Item.WithNameIs("video").ValueIs("on") .ConnectWith.Item.WithNameIs("audio").ValueIs("on") .ConnectWith.Item.WithNameIs("text").ValueIs("on") .WithRequestTypeIs(RequestMethodType.Post) .BuildUrl() .GetDataFromUrl();
这就是Fluent Interface。你可以使用代码配置所有东西,并且你可以更好的阅读它。下面这张是Fluent Interface的类图:
所有红色箭头指向的Fluent Interface的流程,正如你所看到的,流程从IRequestSubmitter => IRequestDataBuilder => IRequestItem => IRequestItemName => IRequestType => IAndConnection => IRequestDataBuilder,最后将在IRequestDataBuilder and IRequestItem之间循环。很简单,不是吗?没有任何秘密在里面。
GET和POST请求方法,如下图:
该项目源代码:http://fluentwebrequest.codeplex.com/
原文地址:http://weblogs.asp.net/thangchung/archive/2011/05/18/fluent-interface-for-webrequest-class.aspx