.NET কোর একটি ক্যোয়ারী স্ট্রিং পার্স এবং সংশোধন করুন


113

আমাকে একটি পরম ইউআরআই দেওয়া হয়েছে যাতে একটি ক্যোরির স্ট্রিং রয়েছে। আমি ক্যোয়ারি স্ট্রিংয়ের নিরাপদে একটি মান যুক্ত করতে এবং একটি বিদ্যমান পরামিতি পরিবর্তন করতে চাইছি।

আমি পছন্দ করি না &foo=barবা নিয়মিত অভিব্যক্তি ব্যবহার না করাই পছন্দ করি , ইউআরআই পলাতকটি জটিল। বরং আমি একটি বিল্ট-ইন মেকানিজমটি ব্যবহার করতে চাই যা আমি জানি এটি সঠিকভাবে এটি করবে এবং পলায়ন পরিচালনা করবে।

আমি একটি টন উত্তর পেয়েছি যা সমস্ত ব্যবহার করে । তবে এটি হ'ল এএসপি.নেট কোর, এখন আর কোনও সিস্টেম নেই e ওয়েবে অ্যাসেমব্লি, আর আর নেই । HttpUtilityHttpUtility

কোর রানটাইম টার্গেট করার সময় এএসপি.নেট কোর এটি করার উপযুক্ত উপায় কী?


গ্রন্থাগারMicrosoft.AspNet.WebUtilties হতে পারে তার বিকল্প । Mono.HttpUtility
রাজমিস্ত্রি

আমি তার জন্য একটি পোস্ট লিখেছি, এখানে একবার দেখুন: neelbutt40.wordpress.com/2017/07/06/…
নীল

2
আপডেট 2017: .NET কোর 2.0 এখন অন্তর্ভুক্ত HttpUtilityএবং ParseQueryStringপদ্ধতি।
কেটিসিও

উত্তর:


152

আপনি যদি এএসপি.নেট কোর 1 বা 2 ব্যবহার করে Microsoft.AspNetCore.WebUtilities.QueryHelpersথাকেন তবে আপনি এটি মাইক্রোসফ্ট.এএসপনেটকোর.ওয়েব ইউটিলিটি প্যাকেজে ব্যবহার করতে পারেন ।

আপনি যদি WebUtilitiesএএসপি.নেট কোর or.০ বা তার বেশি ব্যবহার করে থাকেন তবে এখন এটিএসপি নেট নেট এসডিকে অংশ এবং এটির জন্য পৃথক ন্যুগেট প্যাকেজ রেফারেন্সের প্রয়োজন নেই।

এটি অভিধানে পার্স করতে:

var uri = new Uri(context.RedirectUri);
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query);

নোট করুন যে ParseQueryStringSystem.Web এর বিপরীতে, এটি এএসপি.নেট IDictionary<string, string[]>কোর 1.x, বা IDictionary<string, StringValues>এএসপি.নেট কোর 2.x বা তার চেয়ে বড় ক্ষেত্রে টাইপের একটি অভিধান দেয় , সুতরাং মানটি স্ট্রিংয়ের সংগ্রহ। অভিধানটি একই নামে একাধিক ক্যোরিয় স্ট্রিং প্যারামিটারগুলি পরিচালনা করে।

আপনি যদি ক্যোয়ারী স্ট্রিংয়ে একটি প্যারামিটার যুক্ত করতে চান তবে আপনি অন্য পদ্ধতিটি ব্যবহার করতে পারেন QueryHelpers:

var parametersToAdd = new System.Collections.Generic.Dictionary<string, string> { { "resource", "foo" } };
var someUrl = "http://www.google.com";
var newUri = Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(someUrl, parametersToAdd);

.Net কোর 2.2 ব্যবহার করে আপনি কোয়েরি স্ট্রিংটি ব্যবহার করে পেতে পারেন

var request = HttpContext.Request;
var query = request.query;
foreach (var item in query){
   Debug.WriteLine(item) 
}

আপনি কী-এর একটি সংকলন পাবেন: মান জোড়া - এর মতো like

[0] {[companyName, ]}
[1] {[shop, ]}
[2] {[breath, ]}
[3] {[hand, ]}
[4] {[eye, ]}
[5] {[firstAid, ]}
[6] {[eyeCleaner, ]}

1
এফওয়াইআই, ওয়েব ইউটিলিটি প্যাকেজ। নেট কোর 1.0 এর সাথে সামঞ্জস্যপূর্ণ নয়। Microsoft.AspNetCore.WebUtilitiesপরিবর্তে আপনার প্রয়োজন হতে পারে ।
জাইমে

6
@ জাইম আশ্চর্য পর্যবেক্ষণ! আপনি কি আমার উত্তরটি আপডেটের সাথে সম্পাদনা করতে পারেন যাতে আপনি এর জন্য ক্রেডিট পান?
vcsjones

3
সংস্করণ সম্পন্ন। লিগ্যাসি। নেট সংস্করণগুলির ক্ষেত্রে পুরানো নেমস্পেসও রাখা।
জায়মে

1
দেখা যাচ্ছে যে কোয়েরিহেল্পার্স.এডডকুয়ের স্ট্রিং ব্যবহার করে স্বয়ংক্রিয়ভাবে স্ট্রিংগুলি - হরল আর্পেক্ট হবে।
জোশ

2
রিটার্নের ধরণটি এখন আইডোরিয়াম <স্ট্রিং, স্ট্রিংভ্যালু> এর পরিবর্তে আইডিয়োরিজ <স্ট্রিং, স্ট্রিং []>
বিটি্লগ

35

নিখুঁত ইউআরআই নেওয়ার সবচেয়ে সহজ এবং সর্বাধিক স্বজ্ঞাত উপায় কেবল এএসপি.নেট কোর প্যাকেজগুলি ব্যবহার করে এটির ক্যোয়ারিং স্ট্রিংয়ের কৌশলটি হ'ল কয়েকটি সহজ পদক্ষেপে করা যেতে পারে:

প্যাকেজ ইনস্টল করুন

প্রধানমন্ত্রী> ইনস্টল-প্যাকেজ মাইক্রোসফ্ট.অ্যাসনেটকোর.ওয়েব ইউটিলিটিগুলি
প্রধানমন্ত্রী> ইনস্টল-প্যাকেজ মাইক্রোসফ্ট.এএসপনেটকোর.এইচটিটি. এক্সটেনশনস

গুরুত্বপূর্ণ ক্লাস

কেবল তাদের উল্লেখ করতে, আমরা এখানে দুটি গুরুত্বপূর্ণ শ্রেণি ব্যবহার করব: কোয়েরিহেল্পার্স , স্ট্রিংভ্যালু , কোয়েরি বিল্ডার

কোড

// 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<string, string>(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();

যে কোনও পরিবর্তনের সাথে আপ টু ডেট রাখার জন্য, আপনি আমার ব্লগ পোস্টটি এখানে চেক করতে পারেন: http://benjii.me/2017/04/parse-modify-query-strings-asp-net-core/


17

HttpRequestইন্টারফেসের Queryমাধ্যমে পার্স করা ক্যোয়ারী স্ট্রিংটি প্রকাশ করে এমন একটি সম্পত্তি রয়েছে IReadableStringCollection:

/// <summary>
/// Gets the query value collection parsed from owin.RequestQueryString.
/// </summary>
/// <returns>The query value collection parsed from owin.RequestQueryString.</returns>
public abstract IReadableStringCollection Query { get; }

গিটহাবের উপর এই আলোচনা এটিও ইঙ্গিত করে।


10

এই ফাংশনটি ফিরে আসে Dictionary<string, string>এবং Microsoft.xxxসামঞ্জস্যের জন্য ব্যবহার করে না

উভয় পক্ষের প্যারামিটার এনকোডিং গ্রহণ করে

সদৃশ কীগুলি গ্রহণ করে (শেষ মানটি ফেরত দেয়)

var rawurl = "https://emp.com/some/path?key1.name=a%20line%20with%3D&key2=val2&key2=valdouble&key3=&key%204=44#book1";
var uri = new Uri(rawurl);
Dictionary<string, string> queryString = ParseQueryString(uri.Query);

// queryString return:
// key1.name, a line with=
// key2, valdouble
// key3, 
// key 4, 44

public Dictionary<string, string> ParseQueryString(string requestQueryString)
{
    Dictionary<string, string> rc = new Dictionary<string, string>();
    string[] ar1 = requestQueryString.Split(new char[] { '&', '?' });
    foreach (string row in ar1)
    {
        if (string.IsNullOrEmpty(row)) continue;
        int index = row.IndexOf('=');
        if (index < 0) continue;
        rc[Uri.UnescapeDataString(row.Substring(0, index))] = Uri.UnescapeDataString(row.Substring(index + 1)); // use Unescape only parts          
     }
     return rc;
}

এটি কাজ করে, তবে সাবস্ট্রিং শুরু করার আগে আপনার সূচিপত্র পরীক্ষা করা উচিত, যেহেতু সম্ভাবনা রয়েছে, সেই সারিতে '=' থাকে না। যা ব্যতিক্রম ঘটায়।
তৌরিব

1
সহায়তার জন্য @ তৌরিবকে ধন্যবাদ, পরিবর্তিত হয়েছে
ওয়াগনার পেরেইরা

1
সতর্কতা: অভিধানটি <স্ট্রিং, স্ট্রিং> সেট করার পরে কোয়েরিতে অ্যারে থাকলে এটি কাজ করবে না! (উদাহরণস্বরূপ "? আইটেম = 1 এবং আইটেম = 2") ওয়ার্কারাউন্ড: নেট কোর 3.1 এর জন্য অনুমানযোগ্য <কীভ্যালিউ পেয়ার </ স্ট্রিং >> অথবা অভিধান <স্ট্রিং, স্ট্রিংভ্যালু> ব্যবহার করুন
কর্কিয়াসওন

ধন্যবাদ @ থ্রি কারকিরিয়াস ওন, এই রুটিনে সর্বশেষ মানটি ফিরিয়ে দিন, "সদৃশ কীগুলির জন্য স্বীকৃতি (শেষ মানটি ফেরান)", আপনার সমাধানটি সমস্ত মান ফেরত দেওয়া ঠিক return
ওয়াগনার পেরেইরা

1

এটি লক্ষ্য করা গুরুত্বপূর্ণ যে সেই সময় থেকে শীর্ষের উত্তরটিকে সঠিক হিসাবে চিহ্নিত করা হয়েছে Microsoft.AspNetCore.WebUtilitiesযা একটি বড় সংস্করণ আপডেট হয়েছে (1.xx থেকে 2.xx পর্যন্ত))

এটি বলেছে, আপনি যদি আপনার বিরুদ্ধে নির্মাণ করছেন netcoreapp1.1তবে নিম্নলিখিতটি চালানো দরকার যা সর্বশেষ সমর্থিত সংস্করণ ইনস্টল করে 1.1.2:

Install-Package Microsoft.AspNetCore.WebUtilities -Version 1.1.2


1

আমি এটি এক্সটেনশন পদ্ধতি হিসাবে ব্যবহার করি, যে কোনও সংখ্যক প্যারামের সাথে কাজ করে:

public static string AddOrReplaceQueryParameter(this HttpContext c, params string[] nameValues)
    {
        if (nameValues.Length%2!=0)
        {
            throw new Exception("nameValues: has more parameters then values or more values then parameters");
        }
        var qps = new Dictionary<string, StringValues>();
        for (int i = 0; i < nameValues.Length; i+=2)
        {
            qps.Add(nameValues[i], nameValues[i + 1]);
        }
        return c.AddOrReplaceQueryParameters(qps);
    }

public static string AddOrReplaceQueryParameters(this HttpContext c, Dictionary<string,StringValues> pvs)
    {
        var request = c.Request;
        UriBuilder uriBuilder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = request.Host.Host,
            Port = request.Host.Port ?? 0,
            Path = request.Path.ToString(),
            Query = request.QueryString.ToString()
        };

        var queryParams = QueryHelpers.ParseQuery(uriBuilder.Query);

        foreach (var (p,v) in pvs)
        {
            queryParams.Remove(p);
            queryParams.Add(p, v);
        }

        uriBuilder.Query = "";
        var allQPs = queryParams.ToDictionary(k => k.Key, k => k.Value.ToString());
        var url = QueryHelpers.AddQueryString(uriBuilder.ToString(),allQPs);

        return url;
    }

পরবর্তী এবং পূর্ববর্তী লিঙ্কগুলি উদাহরণে উদাহরণে:

var next = Context.Request.HttpContext.AddOrReplaceQueryParameter("page",Model.PageIndex+1+"");

var prev = Context.Request.HttpContext.AddOrReplaceQueryParameter("page",Model.PageIndex-1+"");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.