Fluent Interface for WebRequest class
2011-08-09 12:53 Fred-Xu 阅读(535) 评论(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
浙公网安备 33010602011771号