如果没有请求不存在则添加查询字符串
Add Query String if not Exist without Request
我没有Request
,我只有一个url字符串。此外,url 可以是相对的也可以是绝对的。由于 Uri and UriBuilder 不支持相对 urls,我可能不得不手动完成,除非有我不知道的技巧。这个方法在我的项目中可能会用到一千多行代码,所以我想把它做对。
如果传递了亲戚 url,以下代码将中断:
public static string AddQueryStringIfNotExists(string url, string parameter, string value)
{
var uriBuilder = new UriBuilder(url);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
if (query[parameter] == null)
{
query[parameter] = value;
uriBuilder.Query = query.ToString();
}
return uriBuilder.ToString();
}
P.S。我可以通过检查我的参数是否出现在第一个 ?
之后手动完成,但这需要处理几个边缘情况,这是我试图避免的事情(比如另一个参数中包含的参数名称)
可以有一个简单的帮助程序将相对 URL 转换为绝对:
public static string ToAbsoluteUrl(this string url, string domain)
{
var result = url.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? url : domain + url;
return result;
}
url = "/page?skip=0";
url = url.ToAbsoluteUrl("https://example.com"); // https://example.com/page?skip=0
var uriBuilder = new UriBuilder(url);
只需检查您的 url 是否绝对。如果它没有将其转换为绝对 url。
然后使用 HttpUtility.ParseQueryString
解析查询字符串并在需要时添加您的参数。
将 UriBuilder 转换回 Uri。
如果输入是绝对 Uri return 整个 Uri。如果输入是相对的,那么 return 相对 uri。
private static Uri dummy = new Uri("http://dummy/");
public static string AddQueryStringIfNotExists(string url, string parameter, string value)
{
var uri = new Uri(url, UriKind.RelativeOrAbsolute);
var uriBuilder = uri.IsAbsoluteUri ? new UriBuilder(url) : new UriBuilder(new Uri(dummy, url));
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
if (query[parameter] == null)
{
query[parameter] = value;
uriBuilder.Query = query.ToString();
}
return uri.IsAbsoluteUri ? uriBuilder.ToString() : dummy.MakeRelativeUri(new Uri(uriBuilder.ToString())).ToString();
}
示例:
string s = AddQueryStringIfNotExists("somedirectory/mypage/html?something=1", "somethingelse", "1");
输出:
somedirectory/mypage/html?something=1&somethingelse=1
我没有Request
,我只有一个url字符串。此外,url 可以是相对的也可以是绝对的。由于 Uri and UriBuilder 不支持相对 urls,我可能不得不手动完成,除非有我不知道的技巧。这个方法在我的项目中可能会用到一千多行代码,所以我想把它做对。
如果传递了亲戚 url,以下代码将中断:
public static string AddQueryStringIfNotExists(string url, string parameter, string value)
{
var uriBuilder = new UriBuilder(url);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
if (query[parameter] == null)
{
query[parameter] = value;
uriBuilder.Query = query.ToString();
}
return uriBuilder.ToString();
}
P.S。我可以通过检查我的参数是否出现在第一个 ?
之后手动完成,但这需要处理几个边缘情况,这是我试图避免的事情(比如另一个参数中包含的参数名称)
可以有一个简单的帮助程序将相对 URL 转换为绝对:
public static string ToAbsoluteUrl(this string url, string domain)
{
var result = url.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? url : domain + url;
return result;
}
url = "/page?skip=0";
url = url.ToAbsoluteUrl("https://example.com"); // https://example.com/page?skip=0
var uriBuilder = new UriBuilder(url);
只需检查您的 url 是否绝对。如果它没有将其转换为绝对 url。
然后使用 HttpUtility.ParseQueryString
解析查询字符串并在需要时添加您的参数。
将 UriBuilder 转换回 Uri。
如果输入是绝对 Uri return 整个 Uri。如果输入是相对的,那么 return 相对 uri。
private static Uri dummy = new Uri("http://dummy/");
public static string AddQueryStringIfNotExists(string url, string parameter, string value)
{
var uri = new Uri(url, UriKind.RelativeOrAbsolute);
var uriBuilder = uri.IsAbsoluteUri ? new UriBuilder(url) : new UriBuilder(new Uri(dummy, url));
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
if (query[parameter] == null)
{
query[parameter] = value;
uriBuilder.Query = query.ToString();
}
return uri.IsAbsoluteUri ? uriBuilder.ToString() : dummy.MakeRelativeUri(new Uri(uriBuilder.ToString())).ToString();
}
示例:
string s = AddQueryStringIfNotExists("somedirectory/mypage/html?something=1", "somethingelse", "1");
输出:
somedirectory/mypage/html?something=1&somethingelse=1