Parse and modify a query string in .NET Core

后端 未结 6 635
無奈伤痛
無奈伤痛 2020-11-29 00:38

I am given an absolute URI that contains a query string. I\'m looking to safely append a value to the query string, and change an existing parameter.

I would prefer

6条回答
  •  爱一瞬间的悲伤
    2020-11-29 01:33

    The easiest and most intuitive way to take an absolute URI and manipulate it's query string using ASP.NET Core packages only, can be done in a few easy steps:

    Install Packages

    PM> Install-Package Microsoft.AspNetCore.WebUtilities
    PM> Install-Package Microsoft.AspNetCore.Http.Extensions

    Important Classes

    Just to point them out, here are the two important classes we'll be using: QueryHelpers, StringValues, QueryBuilder.

    The Code

    // Raw URI including query string with multiple parameters
    var rawurl = "https://bencull.com/some/path?key1=val1&key2=val2&key2=valdouble&key3=";
    
    // Parse URI, and grab everything except the query string.
    var uri = new Uri(rawurl);
    var baseUri = uri.GetComponents(UriComponents.Scheme | UriComponents.Host | UriComponents.Port | UriComponents.Path, UriFormat.UriEscaped);
    
    // Grab just the query string part
    var query = QueryHelpers.ParseQuery(uri.Query);
    
    // Convert the StringValues into a list of KeyValue Pairs to make it easier to manipulate
    var items = query.SelectMany(x => x.Value, (col, value) => new KeyValuePair(col.Key, value)).ToList();
    
    // At this point you can remove items if you want
    items.RemoveAll(x => x.Key == "key3"); // Remove all values for key
    items.RemoveAll(x => x.Key == "key2" && x.Value == "val2"); // Remove specific value for key
    
    // Use the QueryBuilder to add in new items in a safe way (handles multiples and empty values)
    var qb = new QueryBuilder(items);
    qb.Add("nonce", "testingnonce");
    qb.Add("payerId", "pyr_");
    
    // Reconstruct the original URL with new query string
    var fullUri = baseUri + qb.ToQueryString();
    

    To keep up to date with any changes, you can check out my blog post about this here: http://benjii.me/2017/04/parse-modify-query-strings-asp-net-core/

提交回复
热议问题