代码改变世界

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