如何在C#中构建URL的查询字符串?

602

在代码中从网络资源获取数据时,常见的任务是构建查询字符串以包含所有必要的参数。虽然这并不是什么高深技术,但您需要注意一些巧妙的细节,例如:如果不是第一个参数,则附加&,对参数进行编码等。

执行此操作的代码非常简单,但有点繁琐:

StringBuilder SB = new StringBuilder();
if (NeedsToAddParameter A) 
{ 
  SB.Append("A="); SB.Append(HttpUtility.UrlEncode("TheValueOfA")); 
}

if (NeedsToAddParameter B) 
{
  if (SB.Length>0) SB.Append("&"); 
  SB.Append("B="); SB.Append(HttpUtility.UrlEncode("TheValueOfB")); }
}

这是一个非常普遍的任务,人们期望存在一个实用程序类使其更加优雅和易读。浏览 MSDN,我未能找到一个—这就引出了以下问题:

你知道最优雅且清晰的方法是什么吗?


32
目前看来,处理查询字符串似乎没有一种简单明了的方式,这有点令人沮丧。所谓简单明了,是指使用一个开箱即用、非内部实现、符合标准的框架类。或者我可能遗漏了某些东西? - Grimace of Despair
6
你没有错过什么。构建查询字符串是这个框架中的一个主要缺陷,我已经尝试用Flurl来填补这个空白。 - Todd Menier
2
我个人使用的技术是我在这个问题中引用的技术:https://dev59.com/YmQn5IYBdhLWcg3wGT8X#26744471 - Rostov
你让我想到了我应该构建一个.. new UrlBuilder(existing).AddQuery("key", "value").ToString() - Demetris Leptos
这个答案同样适用于嵌套对象 链接描述 - giorgi02
41个回答

-6

编辑 - 如评论所指出,这不是正确的方法。

有这样一个类 - URI类。"提供统一资源标识符(URI)的对象表示形式,并轻松访问URI的各个部分。"(Microsoft文档)。

以下示例创建了Uri类的实例,并使用它创建了一个WebRequest实例。

C# 示例

Uri siteUri = new Uri("http://www.contoso.com/");

WebRequest wr = WebRequest.Create(siteUri);

看看吧,这个类上有很多方法。


Uri类没有用于管理查询字符串的方法,除了获取它和设置它(我不确定后者)。 - Guss
Uri类非常好,一旦你构建了一个包括查询的URI。Uri是不可变的,所以一旦创建就无法添加内容。虽然有UriBuilder类,但我记得它没有查询字符串的方法;仍需要程序员自己创建。一旦构建了Uri类,它非常适合用于正确的转义等操作。 - ageektrapped

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接