.NET में स्ट्रिंग से url पैरामीटर प्राप्त करें


239

मुझे .NET में एक स्ट्रिंग मिली है जो वास्तव में एक यूआरएल है। मैं एक विशेष पैरामीटर से मान प्राप्त करने का एक आसान तरीका चाहता हूं।

आम तौर पर, मैं सिर्फ उपयोग करूंगा Request.Params["theThingIWant"], लेकिन यह स्ट्रिंग अनुरोध से नहीं है। मैं एक नया Uriआइटम बना सकता हूं जैसे:

Uri myUri = new Uri(TheStringUrlIWantMyValueFrom);

मैं myUri.Queryक्वेरी स्ट्रिंग प्राप्त करने के लिए उपयोग कर सकता हूं ... लेकिन फिर मुझे स्पष्ट रूप से इसे विभाजित करने के कुछ रीजियस तरीके खोजने होंगे।

क्या मुझे कुछ स्पष्ट याद आ रहा है, या वहाँ किसी तरह का कोई निर्माण करने के लिए कोई कमी नहीं है?

जवाबों:


494

रिटर्न ParseQueryStringकरने वाले System.Web.HttpUtilityवर्ग की स्थिर पद्धति का उपयोग करें NameValueCollection

Uri myUri = new Uri("http://www.example.com?param1=good&param2=bad");
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1");

Http://msdn.microsoft.com/en-us/library/ms150046.aspx पर दस्तावेज़ देखें


14
यह पहले पैरामीटर का पता नहीं लगता है। उदाहरण के लिए " google.com/… " को पार्स करने पर पैरामीटर q का पता नहीं चलता
एंड्रयू शेफर्ड

@ और मैंने पुष्टि की। यह अजीब है (बग?)। आप अभी भी HttpUtility.ParseQueryString(myUri.Query).Get(0)यद्यपि का उपयोग करते हैं और यह पहला पैरामीटर निकालेगा। `
मैरिएज पावेल्स्की

कोई भी .NET उपकरण एक पैरामीटर क्वेरी क्वेरी url बनाने के लिए?
शिम्मी वेइटहैंडलर

6
आप पूर्ण क्वेरी URL को पार्स नहीं कर सकते HttpUtility.ParseQueryString(string)! जैसा कि यह नाम है, यह क्वेरी स्ट्रिंग्स को पार्स करने के लिए है, क्वेरी पैरामीटर वाले URL नहीं। यदि आप इसे करना चाहते हैं, तो आपको पहले इसे ?इस तरह से विभाजित करना होगा : Url.Split('?')और अंतिम तत्व का उपयोग करके प्राप्त करें (स्थिति के आधार पर और आपको क्या चाहिए) [0]या LINQ's Last()/ LastOrDefault()
कोसीक

1
जब इसे स्वयं ट्रायल किया जाता है, तो हस्ताक्षर इसे बदल दिया गया है: HttpUtility.ParseQueryString (uri.Query) .GetValues ​​("param1")। पहला ()
सीनेटर


34

यहाँ एक और विकल्प है यदि, किसी भी कारण से, आप उपयोग नहीं करना चाहते हैं या नहीं कर सकते हैं HttpUtility.ParseQueryString()

यह "विकृत" क्वेरी स्ट्रिंग्स के लिए कुछ हद तक सहिष्णु होने के लिए बनाया गया है, अर्थात http://test/test.html?empty=एक खाली मान के साथ एक पैरामीटर बन जाता है। कॉल करने वाला जरूरत पड़ने पर मापदंडों को सत्यापित कर सकता है।

public static class UriHelper
{
    public static Dictionary<string, string> DecodeQueryParameters(this Uri uri)
    {
        if (uri == null)
            throw new ArgumentNullException("uri");

        if (uri.Query.Length == 0)
            return new Dictionary<string, string>();

        return uri.Query.TrimStart('?')
                        .Split(new[] { '&', ';' }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(parameter => parameter.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries))
                        .GroupBy(parts => parts[0],
                                 parts => parts.Length > 2 ? string.Join("=", parts, 1, parts.Length - 1) : (parts.Length > 1 ? parts[1] : ""))
                        .ToDictionary(grouping => grouping.Key,
                                      grouping => string.Join(",", grouping));
    }
}

परीक्षा

[TestClass]
public class UriHelperTest
{
    [TestMethod]
    public void DecodeQueryParameters()
    {
        DecodeQueryParametersTest("http://test/test.html", new Dictionary<string, string>());
        DecodeQueryParametersTest("http://test/test.html?", new Dictionary<string, string>());
        DecodeQueryParametersTest("http://test/test.html?key=bla/blub.xml", new Dictionary<string, string> { { "key", "bla/blub.xml" } });
        DecodeQueryParametersTest("http://test/test.html?eins=1&zwei=2", new Dictionary<string, string> { { "eins", "1" }, { "zwei", "2" } });
        DecodeQueryParametersTest("http://test/test.html?empty", new Dictionary<string, string> { { "empty", "" } });
        DecodeQueryParametersTest("http://test/test.html?empty=", new Dictionary<string, string> { { "empty", "" } });
        DecodeQueryParametersTest("http://test/test.html?key=1&", new Dictionary<string, string> { { "key", "1" } });
        DecodeQueryParametersTest("http://test/test.html?key=value?&b=c", new Dictionary<string, string> { { "key", "value?" }, { "b", "c" } });
        DecodeQueryParametersTest("http://test/test.html?key=value=what", new Dictionary<string, string> { { "key", "value=what" } });
        DecodeQueryParametersTest("http://www.google.com/search?q=energy+edge&rls=com.microsoft:en-au&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1%22",
            new Dictionary<string, string>
            {
                { "q", "energy+edge" },
                { "rls", "com.microsoft:en-au" },
                { "ie", "UTF-8" },
                { "oe", "UTF-8" },
                { "startIndex", "" },
                { "startPage", "1%22" },
            });
        DecodeQueryParametersTest("http://test/test.html?key=value;key=anotherValue", new Dictionary<string, string> { { "key", "value,anotherValue" } });
    }

    private static void DecodeQueryParametersTest(string uri, Dictionary<string, string> expected)
    {
        Dictionary<string, string> parameters = new Uri(uri).DecodeQueryParameters();
        Assert.AreEqual(expected.Count, parameters.Count, "Wrong parameter count. Uri: {0}", uri);
        foreach (var key in expected.Keys)
        {
            Assert.IsTrue(parameters.ContainsKey(key), "Missing parameter key {0}. Uri: {1}", key, uri);
            Assert.AreEqual(expected[key], parameters[key], "Wrong parameter value for {0}. Uri: {1}", parameters[key], uri);
        }
    }
}

Xamarin परियोजना के लिए उपयोगी, जहां HttpUtility अनुपलब्ध है
Artemious

12

@Andrew और @CZFox

मेरे पास एक ही बग था और उस पैरामीटर के होने का कारण पाया गया जो वास्तव में है: http://www.example.com?param1और ऐसा नहीं param1है जो कोई उम्मीद करेगा।

प्रश्न चिह्न से पहले और शामिल सभी वर्णों को हटाकर इस समस्या को हल करता है। तो संक्षेप में HttpUtility.ParseQueryStringफ़ंक्शन को केवल एक मान्य क्वेरी स्ट्रिंग पैरामीटर की आवश्यकता होती है जिसमें प्रश्न चिह्न के बाद केवल वर्ण होते हैं:

HttpUtility.ParseQueryString ( "param1=good&param2=bad" )

मेरा समाधान:

string RawUrl = "http://www.example.com?param1=good&param2=bad";
int index = RawUrl.IndexOf ( "?" );
if ( index > 0 )
    RawUrl = RawUrl.Substring ( index ).Remove ( 0, 1 );

Uri myUri = new Uri( RawUrl, UriKind.RelativeOrAbsolute);
string param1 = HttpUtility.ParseQueryString( myUri.Query ).Get( "param1" );`

जब URI को तत्काल किया जाता है तो मुझे त्रुटि मिलती है "अमान्य URI: URI का प्रारूप निर्धारित नहीं किया जा सका।" मुझे नहीं लगता कि यह समाधान इरादा के अनुसार काम करता है।
पॉल मैथ्यूज

@PaulMatthews, आप सही हैं। इस दिए गए समाधान के समय, मैं पुराने .net फ्रेमवर्क 2.0 का उपयोग कर रहा था। आपके कथन की पुष्टि करने के लिए, मैंने यूसुफ अलबहारा द्वारा LINQPad v2 में इस समाधान को कॉपी और पेस्ट किया और आपके द्वारा उल्लिखित एक ही त्रुटि प्राप्त की।
एमओ गौविन 12-1213

@PaulMatthews, Uri myUri = new Uri (RawUrl) को पढ़ने वाली लाइन को हटाने के लिए; और केवल RawUrl को अंतिम विवरण के रूप में पास करें: string param1 = HttpUtility.ParseQueryString (RawUrl) .Get ("param2");
मो। गौविन

हाँ, यह तथ्य कि यह केवल क्वेरी स्ट्रिंग भाग को नाम देता है और प्रलेखन में है। यह बग नहीं है। मुझे भी यकीन नहीं है कि वे इसे कैसे भी स्पष्ट कर सकते हैं। ParseQueryStringपार्स क्वेरी स्ट्रिंग्स।
पांडावुड

12

ऐसा लगता है कि आपको मूल्यों पर लूप करना चाहिए myUri.Queryऔर इसे वहां से पार्स करना चाहिए ।

 string desiredValue;
 foreach(string item in myUri.Query.Split('&'))
 {
     string[] parts = item.Replace("?", "").Split('=');
     if(parts[0] == "desiredKey")
     {
         desiredValue = parts[1];
         break;
     }
 }

हालांकि, मैं इस कोड का उपयोग विकृत URL के एक समूह पर परीक्षण किए बिना नहीं करूंगा। यह इनमें से कुछ पर टूट सकता है:

  • hello.html?
  • hello.html?valuelesskey
  • hello.html?key=value=hi
  • hello.html?hi=value?&b=c
  • आदि

4

पहले पैरामीटर के साथ भी काम करने के लिए आप इसके लिए निम्न वर्कअराउंड का उपयोग कर सकते हैं:

var param1 =
    HttpUtility.ParseQueryString(url.Substring(
        new []{0, url.IndexOf('?')}.Max()
    )).Get("param1");

2

की FillFromStringविधि देखने के लिए .NET रिफलेक्टर का उपयोग करें System.Web.HttpValueCollection। वह आपको वह कोड देता है जो ASP.NET Request.QueryStringसंग्रह को भरने के लिए उपयोग कर रहा है ।


1

या यदि आप URL नहीं जानते हैं (तो हार्डकॉडिंग से बचने के लिए, इसका उपयोग करें AbsoluteUri

उदाहरण ...

        //get the full URL
        Uri myUri = new Uri(Request.Url.AbsoluteUri);
        //get any parameters
        string strStatus = HttpUtility.ParseQueryString(myUri.Query).Get("status");
        string strMsg = HttpUtility.ParseQueryString(myUri.Query).Get("message");
        switch (strStatus.ToUpper())
        {
            case "OK":
                webMessageBox.Show("EMAILS SENT!");
                break;
            case "ER":
                webMessageBox.Show("EMAILS SENT, BUT ... " + strMsg);
                break;
        }

0

यदि आप अपने QueryString को डिफ़ॉल्ट पृष्ठ पर प्राप्त करना चाहते हैं। .Default पृष्ठ का अर्थ है आपका वर्तमान पृष्ठ url। आप इस कोड को आज़मा सकते हैं:

string paramIl = HttpUtility.ParseQueryString(this.ClientQueryString).Get("city");

0

यह वास्तव में बहुत सरल है, और यह मेरे लिए काम किया :)

        if (id == "DK")
        {
            string longurl = "selectServer.aspx?country=";
            var uriBuilder = new UriBuilder(longurl);
            var query = HttpUtility.ParseQueryString(uriBuilder.Query);
            query["country"] = "DK";

            uriBuilder.Query = query.ToString();
            longurl = uriBuilder.ToString();
        } 

0

जो कोई स्ट्रिंग से सभी क्वेरी स्ट्रिंग के माध्यम से लूप करना चाहता है

        foreach (var item in new Uri(urlString).Query.TrimStart('?').Split('&'))
        {
            var subStrings = item.Split('=');

            var key = subStrings[0];
            var value = subStrings[1];

            // do something with values
        }


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.