当前位置:首页 > 开发 > 编程语言 > C# > 正文

C#下的Uri.Builder

发表于: 2012-08-20   作者:dai_lm   来源:转载   浏览次数:
摘要: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; namespace Uri { class Builder { private string scheme = "http&
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace Uri
{
    class Builder
    {
        private string scheme = "http";
        private string host = "";
        private StringBuilder path;
        private Boolean endwithSlash = false;
        private IDictionary<string, string> param = null;

        public Builder()
        {
            scheme = "http";
            host = "";
            path = new StringBuilder("");
            endwithSlash = false;

            param = new Dictionary<string, string>();
        }

        public Builder SetScheme(string scheme)
        {
            this.scheme = scheme;

            return this;
        }

        public Builder SetHost(string host)
        {
            this.host = host;

            return this;
        }

        public Builder Path(string path)
        {
            return AppendPath(ParsePath(path));
        }

        public Builder EncodePath(string path)
        {
            return AppendEncodePath(ParsePath(path));
        }

        public Builder AppendPath(string path)
        {
            if (path.Length > 0)
            {
                // start with '/'
                if (!endwithSlash && !path.StartsWith("/"))
                    this.path.Append("/");

                this.path.Append(path);

                if (path.EndsWith("/"))
                    endwithSlash = true;
                else
                    endwithSlash = false;
            }

            return this;
        }

        public Builder AppendEncodePath(string path)
        {
            return AppendPath(Encode(path));
        }

        private string ParsePath(string path)
        {
            int posScheme = path.IndexOf("://");
            if (posScheme > 0)
            {
                // get scheme
                scheme = path.Substring(0, posScheme);
                path = path.Substring(posScheme + 3);
            }

            int posHost = path.IndexOf("/");
            if (posHost == -1)
            {
                // not found '/'
                host = path;
                path = "";
            }
            else
            {
                host = path.Substring(0, posHost);
                path = path.Substring(posHost + 1);
            }

            return path;
        }

        public Builder AppendParameter(string key, string value)
        {
            param.Add(key, value);

            return this;
        }

        public Builder AppendEncodeParameter(string key, string value)
        {
            return AppendParameter(key, Encode(value));
        }

        public string ToString()
        {
            // generate URL string
            StringBuilder url = new StringBuilder("");

            // scheme
            url.Append(scheme).Append("://");

            // host
            url.Append(host);

            // path
            if (path.Length > 0)
                url.Append(path);

            // param
            if (param.Count > 0)
            {
                string pre = "?";
                foreach (KeyValuePair<string, string> p in param)
                {
                    url.Append(pre);

                    if (p.Value != null)
                        url.AppendFormat("{0}={1}", p.Key, p.Value);
                    else
                        url.Append(p.Key);

                    pre = "&";
                }
            }

            return url.ToString();
        }

        private string Encode(string value)
        {
            return HttpUtility.UrlEncode(value);
        }

        public Builder Parse(string url)
        {
            // seperate path and parameters
            string[] div = url.Split(new string[] { "?" }, 2, StringSplitOptions.None);
            Path(div[0]);
            if (div.Length == 2)
                ParseParameters(div[1]);

            return this;
        }

        private void ParseParameters(string param)
        {
            if (param.Length == 0)
                return;

            string[] para = param.Split(new string[] { "&" }, StringSplitOptions.None);
            foreach (string p in para)
            {
                string[] val = p.Split(new string[] { "=" }, 2, StringSplitOptions.None);
                if (val.Length == 2)
                    AppendParameter(val[0], val[1]);
                else
                    AppendParameter(val[0], null);
            }
        }
    }
}

C#下的Uri.Builder

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1.首先需要下载.net下的驱动类。rabbitmq.client.dll.安装后可以使用提供的文档。当然也可以直接从
在.net中,可调用的dll(动态链接库)文件其实就是一个类库。 我们可以通过写一个类,然后把它编译
一、参数  1.参数是什么?     很多情况下,我们声明一个方法,就是为了它的返回值。这我们只
希尔排序(Shell Sort) 排序思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。
在.net中,可调用的dll(动态链接库)文件其实就是一个类库。 我们可以通过写一个类,然后把它编译
C#下串口编程测试 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 软
Mono,一个开源项目,能使.NET能在您的Linux操作系统上运行。通过Mono的帮助可以在Linux上编写C#程
引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方
以前在xp下开发,最近全部转移到WIN7下,发现程序运行会有个小问题,就是获取系统当前是否静音的时
原文 http://www.cnblogs.com/feiyangqingyun/archive/2013/05/29/3106238.html 以前在xp下开发,最
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号