如果没有请求不存在则添加查询字符串

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