什么是 HTTP 查询字符串
例如此 URL:https://example.com:80/query?key1=value2&key2=value2
对其拆解我们可以得到以下部分:
https:协议://example.com:域名:80:端口/query:路径?key1=value2&key2=value2:参数(也称作查询字符串)
如何生成 HTTP 查询字符串
暴力拼接
略
System.Web.HttpUtility
var query = HttpUtility.ParseQueryString(string.Empty);
query["a+b"] = "a%b";
query["b"] = "2+1";
var queryString = query.ToString(); // a+b=a%25b&b=2%2b1
HttpUtility.ParseQueryString(string.Empty) 会返回一个空的NameValueCollection,你只需要往里面填充参数然后调用ToString()即可生成查询字符串
您不能使用
new NameValueCollection()来达到同样的效果,因为HttpUtility.ParseQueryString(string)返回的实际是HttpQSCollection类型,该类型是NameValueCollection的派生类型且不对外公开,所以你也无法通过new关键字来创建HttpQSCollection类型
此方法生成的查询字符串只会转义
value且不包含前导字符?
Microsoft.AspNetCore.Http.QueryString
此方法仅适用于 SDK 为
Microsoft.NET.Sdk.Web的项目
var queryString = QueryString.Create(new Dictionary<string, string?>
{
["a+b"] = "a%b",
["b"] = "2+1",
}).ToString(); // ?a%2Bb=a%25b&b=2%2B1
此方法生成的查询字符串会转义
key和value且包含前导字符?
除了调用
ToString()也可以调用ToUriComponent(),二者效果相同