c# - उरी से अलग प्रश्न पैरामीटर प्राप्त करें





.net uri (10)


पृथक परियोजनाओं के लिए, जहां निर्भरता न्यूनतम रखी जानी चाहिए, मैंने खुद को इस कार्यान्वयन का उपयोग करके पाया:

var arguments = uri.Query
  .Substring(1) // Remove '?'
  .Split('&')
  .Select(q => q.Split('='))
  .ToDictionary(q => q.FirstOrDefault(), q => q.Skip(1).FirstOrDefault());

हालांकि, ध्यान दें कि, मैं किसी भी तरह के एन्कोडेड तारों को संभाल नहीं पा रहा हूं, क्योंकि मैं इसे नियंत्रित वातावरण में उपयोग कर रहा था, जहां एन्कोडिंग समस्या सर्वर पक्ष पर एक कोडिंग त्रुटि होगी जिसे ठीक किया जाना चाहिए।

इस प्रश्न का उत्तर यहां दिया गया है:

मेरे पास एक यूरी स्ट्रिंग है: http://example.com/file?a=1&b=2&c=string%20param

क्या कोई मौजूदा फ़ंक्शन है जो क्वेरी पैरामीटर स्ट्रिंग को एक शब्दकोश में एएसपी.NET संदर्भ के रूप में परिवर्तित करेगा। अनुरोध करता है।

मैं एक कंसोल ऐप लिख रहा हूं, न कि वेब-सेवा, इसलिए कोई संदर्भ नहीं है। मेरे लिए यूआरएल पार्स करने के लिए अनुरोध करें।

मुझे पता है कि क्वेरी स्ट्रिंग को खुद को क्रैक करना बहुत आसान है, लेकिन यदि मैं मौजूद हूं तो मैं एक एफसीएल फ़ंक्शन का उपयोग करना चाहता हूं।




इसे इस्तेमाल करो:

string uri = ...;
string queryString = new System.Uri(uri).Query;
var queryDictionary = System.Web.HttpUtility.ParseQueryString(queryString);

Tejs द्वारा यह कोड URI से क्वेरी स्ट्रिंग प्राप्त करने का 'उचित' तरीका नहीं है:

string.Join(string.Empty, uri.Split('?').Skip(1));






कोड की एक पंक्ति में:

string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ"));



आप उपयोग कर सकते हैं:

var queryString = url.Substring(url.IndexOf('?')).Split('#')[0]
System.Web.HttpUtility.ParseQueryString(queryString)

MSDN




यह काम करना चाहिए:

string url = "http://example.com/file?a=1&b=2&c=string%20param";
string querystring = url.Substring(url.IndexOf('?'));
System.Collections.Specialized.NameValueCollection parameters = 
   System.Web.HttpUtility.ParseQueryString(querystring);

MSDN मुताबिक। सटीक संग्रह प्रकार नहीं जिसे आप ढूंढ रहे हैं, लेकिन फिर भी उपयोगी है।

संपादित करें: जाहिर है, अगर आप ParseQueryString को पूरा यूआरएल प्रदान ParseQueryString यह संग्रह की पहली कुंजी के रूप में ' http://example.com/file?a ' जोड़ देगा। चूंकि शायद वह नहीं है जो आप चाहते हैं, मैंने यूआरएल का केवल प्रासंगिक हिस्सा प्राप्त करने के लिए सबस्ट्रिंग को जोड़ा।




HttpUtility.ParseQueryString() पर एक नज़र डालें, यह आपको एक शब्दकोश के बजाय नाम NameValueCollection देगा, लेकिन आपको अभी भी जो चाहिए वह करना चाहिए।

दूसरा विकल्प string.Split() का उपयोग string.Split()string.Split()

    string url = @"http://example.com/file?a=1&b=2&c=string%20param";
    string[] parts = url.Split(new char[] {'?','&'});
    ///parts[0] now contains http://example.com/file
    ///parts[1] = "a=1"
    ///parts[2] = "b=2"
    ///parts[3] = "c=string%20param"



मुझे इसे आधुनिक विंडोज ऐप के लिए करना था। मैंने निम्नलिखित का उपयोग किया:

public static class UriExtensions
{
    private static readonly Regex _regex = new Regex(@"[?&](\w[\w.]*)=([^?&]+)");

    public static IReadOnlyDictionary<string, string> ParseQueryString(this Uri uri)
    {
        var match = _regex.Match(uri.PathAndQuery);
        var paramaters = new Dictionary<string, string>();
        while (match.Success)
        {
            paramaters.Add(match.Groups[1].Value, match.Groups[2].Value);
            match = match.NextMatch();
        }
        return paramaters;
    }
}






अच्छे मौजूदा उत्तर, जिनमें से कुछ मैं अपने साथ आना चाहता था:

मुझे यूआरआई से रास्ता प्राप्त करना है और यूआरआई को पथ से प्राप्त करना है, और Google को एक ही समस्या है जो किसी भी मुद्दे के लिए अंतर बता रही है (उदाहरण के लिए, उस वीडियो के MediaStore से थंबनेल प्राप्त करने के लिए जिसका भौतिक स्थान आप पहले से ही कर चुके हैं ) है। भूतपूर्व:

/**
 * Gets the corresponding path to a file from the given content:// URI
 * @param selectedVideoUri The content:// URI to find the file path from
 * @param contentResolver The content resolver to use to perform the query.
 * @return the file path as a string
 */
private String getFilePathFromContentUri(Uri selectedVideoUri,
        ContentResolver contentResolver) {
    String filePath;
    String[] filePathColumn = {MediaColumns.DATA};

    Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    filePath = cursor.getString(columnIndex);
    cursor.close();
    return filePath;
}

उत्तरार्द्ध (जो मैं वीडियो के लिए करता हूं, लेकिन MediaStore.Video के लिए MediaStore.Audio (आदि) को प्रतिस्थापित करके ऑडियो या फ़ाइलें या संग्रहीत सामग्री के अन्य प्रकारों के लिए भी उपयोग किया जा सकता है):

/**
 * Gets the MediaStore video ID of a given file on external storage
 * @param filePath The path (on external storage) of the file to resolve the ID of
 * @param contentResolver The content resolver to use to perform the query.
 * @return the video ID as a long
 */
private long getVideoIdFromFilePath(String filePath,
        ContentResolver contentResolver) {


    long videoId;
    Log.d(TAG,"Loading file " + filePath);

            // This returns us content://media/external/videos/media (or something like that)
            // I pass in "external" because that's the MediaStore's name for the external
            // storage on my device (the other possibility is "internal")
    Uri videosUri = MediaStore.Video.Media.getContentUri("external");

    Log.d(TAG,"videosUri = " + videosUri.toString());

    String[] projection = {MediaStore.Video.VideoColumns._ID};

    // TODO This will break if we have no matching item in the MediaStore.
    Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(projection[0]);
    videoId = cursor.getLong(columnIndex);

    Log.d(TAG,"Video ID is " + videoId);
    cursor.close();
    return videoId;
}

असल में, MediaStore का DATA कॉलम (या जो भी उप-अनुभाग आप पूछताछ कर रहे हैं) फ़ाइल पथ को संग्रहीत करता है, इसलिए आप या तो उस DATA उपयोग करते हैं जिसे आप DATA फ़ील्ड को देखने के लिए जानते हैं, या जो कुछ भी आप चाहते हैं उसे देखने के लिए फ़ील्ड का उपयोग करें ।

मैं अपने डेटा के साथ क्या करना है यह जानने के लिए उपर्युक्त Scheme उपयोग करता हूं:

 private boolean  getSelectedVideo(Intent imageReturnedIntent, boolean fromData) {

    Uri selectedVideoUri;

    //Selected image returned from another activity
            // A parameter I pass myself to know whether or not I'm being "shared via" or
            // whether I'm working internally to my app (fromData = working internally)
    if(fromData){
        selectedVideoUri = imageReturnedIntent.getData();
    } else {
        //Selected image returned from SEND intent 
                    // which I register to receive in my manifest
                    // (so people can "share via" my app)
        selectedVideoUri = (Uri)getIntent().getExtras().get(Intent.EXTRA_STREAM);
    }

    Log.d(TAG,"SelectedVideoUri = " + selectedVideoUri);

    String filePath;

    String scheme = selectedVideoUri.getScheme(); 
    ContentResolver contentResolver = getContentResolver();
    long videoId;

    // If we are sent file://something or content://org.openintents.filemanager/mimetype/something...
    if(scheme.equals("file") || (scheme.equals("content") && selectedVideoUri.getEncodedAuthority().equals("org.openintents.filemanager"))){

        // Get the path
        filePath = selectedVideoUri.getPath();

        // Trim the path if necessary
        // openintents filemanager returns content://org.openintents.filemanager/mimetype//mnt/sdcard/xxxx.mp4
        if(filePath.startsWith("/mimetype/")){
            String trimmedFilePath = filePath.substring("/mimetype/".length());
            filePath = trimmedFilePath.substring(trimmedFilePath.indexOf("/"));
        }

        // Get the video ID from the path
        videoId = getVideoIdFromFilePath(filePath, contentResolver);

    } else if(scheme.equals("content")){

        // If we are given another content:// URI, look it up in the media provider
        videoId = Long.valueOf(selectedVideoUri.getLastPathSegment());
        filePath = getFilePathFromContentUri(selectedVideoUri, contentResolver);

    } else {
        Log.d(TAG,"Failed to load URI " + selectedVideoUri.toString());
        return false;
    }

     return true;
 }




c# .net uri