Android पर पार्सिंग क्वेरी स्ट्रिंग


271

Java EE में ServletRequest.getParameterValues ​​() है

गैर-ईई प्लेटफार्मों पर, URL.getQuery () बस एक स्ट्रिंग लौटाता है।

जावा ईई पर नहीं होने पर URL में क्वेरी स्ट्रिंग को ठीक से पार्स करने का सामान्य तरीका क्या है ?


< रंत >

यह उत्तर देने और अपने खुद के पार्सर बनाने के लिए लोकप्रिय है। यह बहुत ही रोचक और रोमांचक माइक्रो-कोडिंग परियोजना है, लेकिन मैं यह नहीं कह सकता कि यह एक अच्छा विचार है :(

नीचे दिए गए कोड स्निपेट आमतौर पर त्रुटिपूर्ण या टूटे हुए, btw होते हैं। उन्हें तोड़ना पाठक के लिए एक दिलचस्प अभ्यास है। और हैकर्स उन वेबसाइटों पर हमला करते हैं जो उनका उपयोग करते हैं

क्वेरी स्ट्रिंग को पार्स करना एक अच्छी तरह से परिभाषित समस्या है लेकिन कल्पना को पढ़ना और बारीकियों को समझना गैर-तुच्छ है। कुछ प्लेटफ़ॉर्म लाइब्रेरी कोडर को कठिन काम करने देना और फ़िक्सिंग करना आपके लिए बेहतर है!

< / शेखर >


क्या आप एक नमूना URL पोस्ट कर सकते हैं, जो आप से प्राप्त कर रहे हैं getQuery(), और क्या आप आउटपुट के रूप में प्राप्त करना चाहते हैं?
थॉमस ओवंस

1
क्या आप इसे सर्वलेट या JSP पेज से करना चाहते हैं? जवाब देने से पहले मुझे कुछ स्पष्टीकरण चाहिए।
चाडएनसी

1
क्या आपको POST मापदंडों को पार्स करने की भी आवश्यकता है?
थिलो

2
यहां तक ​​कि अगर आप J2EE पर हैं (या ओएसजीआई के माध्यम से जोड़े गए चयनित ईई पैकेज के साथ एसई पर), तो यह सवाल समझ में आ सकता है। मेरे मामले में, क्वेरी स्ट्रिंग्स / url- एन्कोडेड POST बॉडी को सिस्टम के एक भाग द्वारा संसाधित किया जाता है जो जानबूझकर अज्ञेय की तरह सामान के लिए होता है ServletRequest
हन्नो फिएट

61
<Rant /> के लिए अपग्रेड किया गया!
नाऊकर

जवाबों:


65

चूंकि एंड्रॉइड एम चीजें अधिक जटिल हो गई हैं। Android.net.URI .getQueryParameter () के उत्तर में एक बग है जो JellyBean से पहले रिक्त स्थान को तोड़ता है। Apache URLEncodedUtils.parse () ने काम किया, लेकिन L में पदावनत किया गया , और M में हटा दिया गया

तो अब सबसे अच्छा जवाब UrlQuerySanitizer है । यह एपीआई स्तर 1 के बाद से अस्तित्व में है और अभी भी मौजूद है। यह आपको मुश्किल मुद्दों के बारे में भी सोचता है जैसे कि आप विशेष वर्ण, या दोहराया मूल्यों को कैसे संभालते हैं।

सबसे सरल कोड है

UrlQuerySanitizer.ValueSanitizer sanitizer = UrlQuerySanitizer.getAllButNullLegal();
// remember to decide if you want the first or last parameter with the same name
// If you want the first call setPreferFirstRepeatedParameter(true);
sanitizer.parseUrl(url);
String value = sanitizer.getValue("paramName"); // get your value

यदि आप डिफ़ॉल्ट पार्सिंग व्यवहार से खुश हैं तो आप यह कर सकते हैं:

new UrlQuerySanitizer(url).getValue("paramName")

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


4
URLQuerySanitizer.getAllButNullLegal () UrlQuerySanitizer.ValueSanitizer लौटाता है, UrlQuerySanitizer नहीं।
पीटर झाओ

31
किसी कारण से उपरोक्त कार्य मेरे लिए नहीं था, मुझे इसे थोड़ा संशोधित करना पड़ा - जिससे यह और भी आसान हो जाता है:UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(YourStringURL); String value = sanitizer.getValue("parameter");
SeBsZ

3
काम नहीं। UrlQuerySanitizer sdk-23 में केवल एक ही विधि हैsanitize()
निंजा

यह विशेष वर्ण और इमोजी को डिकोड करेगा _। मुझे stackoverflow.com/a/35638979/1155282
Irshu

क्या इस के बराबर एक स्प्रिंग फ्रेमवर्क है?
इमजोशुआ

202

Android पर:

import android.net.Uri;

[...]

Uri uri=Uri.parse(url_string);
uri.getQueryParameter("para1");

20
ध्यान दें कि यह Uri वर्ग का उपयोग करता है न कि URI वर्ग का (Uri android.net का हिस्सा है, जबकि URI java.net का हिस्सा है)
Marius

5
यह भी ध्यान दें कि आइसक्रीम सैंडविच से पहले, यह एक अंतरिक्ष चरित्र के मूल्यों में + वर्णों को पार्स करने में विफल रहता है।
रैप्ट्रीच

@rpetrich वास्तव में डॉक्स का कहना है कि बग जेली बीन से पहले है, जिसमें आइसक्रीम सैंडविच भी शामिल है। रेफरी
बिग मैकलारेग्यूज

64

Android पर, अपाचे पुस्तकालय एक क्वेरी पार्सर प्रदान करते हैं:

http://developer.android.com/reference/org/apache/http/client/utils/URLEncodedUtils.html और http://hc.apache.org/httpcompenders-client-ga/httpclient/apidocs/org/apache/ http / ग्राहक / utils / URLEncodedUtils.html


9
यह अपाचे http क्लाइंट लाइब्रेरी में उपलब्ध है, न केवल एंड्रॉइड पर। Btw, अपाचे का लिंक बदल दिया गया था। नवीनतम है: hc.apache.org/httpcompenders-client-ga/httpclient/apidocs/org/…
क्रिस्टियन व्रेबी

9
एक विशिष्ट कुंजी के लिए मूल्य खोजने के लिए, फिर से आपको URLEncodedUtils.parse()एक बार लौटना Listहोगा। यह बहुत अच्छा होगा अगर यह Mapबलूएससी के जवाब की तरह लौट आए ।
असफ

1
@ हन्नो फिएट का मतलब है कि आप इन विकल्पों पर भरोसा करते हैं? मुझे पता है कि वे छोटी गाड़ी हैं। मुझे पता है कि मुझे जो कीड़े दिखाई दे रहे हैं वे केवल लोगों को 'निश्चित' संस्करणों को अपनाने के लिए प्रोत्साहित करेंगे, बजाय इसके कि मैं जिन बगों की अनदेखी कर चुका हूँ उनके लिए खुद को खोजूँ।
विल

1
@Will - ठीक है, मैं कभी भी कॉपी-एंड-पेस्ट स्निपेट पर भरोसा नहीं करूंगा जो मुझे किसी भी वेबसाइट से मिला है, और किसी को भी नहीं करना चाहिए। लेकिन यहाँ, इन स्निपेट्स को अच्छी तरह से समीक्षा की जाती है और टिप्पणी की जाती है और इस प्रकार areवास्तव में मददगार होती है। बस कोड के साथ क्या गलत हो सकता है पर कुछ सुझाव देखकर पहले से ही अपने लिए सोचने में बहुत मदद मिलती है। और तुम बुरा मानो, मेरा यह कहने का मतलब नहीं था कि "अपना खुद का रोल बेहतर है", बल्कि यह कि अपने स्वयं के कोड में एक सूचित निर्णय के लिए अच्छी सामग्री रखना बहुत अच्छा है।
हनो फिएट

8
मैं कल्पना करता हूं कि पार्स एक सूची लौटाता है ताकि यह स्थितीय क्रम बनाए रखे और अधिक आसानी से डुप्लिकेट प्रविष्टियों की अनुमति दे सके।
dhaag23

26

यहाँ BalusC का उत्तर है , लेकिन यह संकलन और परिणाम लौटाता है:

public static Map<String, List<String>> getUrlParameters(String url)
        throws UnsupportedEncodingException {
    Map<String, List<String>> params = new HashMap<String, List<String>>();
    String[] urlParts = url.split("\\?");
    if (urlParts.length > 1) {
        String query = urlParts[1];
        for (String param : query.split("&")) {
            String pair[] = param.split("=");
            String key = URLDecoder.decode(pair[0], "UTF-8");
            String value = "";
            if (pair.length > 1) {
                value = URLDecoder.decode(pair[1], "UTF-8");
            }
            List<String> values = params.get(key);
            if (values == null) {
                values = new ArrayList<String>();
                params.put(key, values);
            }
            values.add(value);
        }
    }
    return params;
}

1
जेवीएम नोट: मैंने जावा कलेक्शंस का उपयोग करके स्काला में इसके बराबर रूप को लागू किया है; यहाँ github gist है: gist.github.com/3504765
Jay Taylor

2
मैं बदलने का सुझाव String pair[] = param.split("=");में String pair[] = param.split("=", 2);केवल पहली घटना पर कुंजी = मान जोड़ी विभाजित करने के लिए। मेरा मानना ​​है कि इसे मूल्य में बिना संकेत के बराबर संकेत देने की अनुमति है।
डेनी जुले

22

यदि आपके पास अपने वर्गपथ पर जेटी (सर्वर या क्लाइंट) का काम है तो आप जेट्टी उपयोग कक्षाओं ( जावदोक देखें ) का उपयोग कर सकते हैं , जैसे:

import org.eclipse.jetty.util.*;
URL url = new URL("www.example.com/index.php?foo=bar&bla=blub");
MultiMap<String> params = new MultiMap<String>();
UrlEncoded.decodeTo(url.getQuery(), params, "UTF-8");

assert params.getString("foo").equals("bar");
assert params.getString("bla").equals("blub");

13

यदि आप स्प्रिंग 3.1 या उससे अधिक का उपयोग कर रहे हैं (उम्मीद है कि समर्थन आगे वापस चला गया था), तो आप UriComponentsऔर का उपयोग कर सकते हैं UriComponentsBuilder:

UriComponents components = UriComponentsBuilder.fromUri(uri).build();
List<String> myParam = components.getQueryParams().get("myParam");

components.getQueryParams() एक रिटर्न MultiValueMap<String, String>

यहाँ कुछ और प्रलेखन है


यह ऐसी चीज है जिसकी मुझे तलाश है। मेरा सवाल यह है कि मुझे यूरी कैसे मिलता है? मैं कोड के रखरखाव के साथ फंस गया हूं जिसे मैं बहुत बदल नहीं सकता हूं और हम HttpServlet का उपयोग नहीं कर रहे हैं। केवल एनोटेशन और स्प्रिंग (@Get, @Produces (MediaType) और @Path ("/ dataAsJSON / datafield / {datafield}) का उपयोग करने के बजाय बस यह जानना होगा कि क्वेरी स्ट्रिंग कैसे प्राप्त करें ताकि मैं इसे पार्स कर सकूं जैसा कि इसमें दिखाया गया है इस उदाहरण।
Nelda.techspiress

5

किसी सर्वलेट या JSP पेज के लिए आप request.getParameter ("paramname") का उपयोग करके कुंजी / मान जोड़े को प्राप्त कर सकते हैं

String name = request.getParameter("name");

इसे करने के अन्य तरीके भी हैं लेकिन यही तरीका है कि मैं इसे उन सभी सर्वलेट्स और जेएसपी पेजों में बनाता हूं जो मैं बनाता हूं।


3
HttpServletRequest J2EE का हिस्सा है जो उसके पास नहीं है। इसके अलावा getParamter () का उपयोग करना वास्तव में पार्सिंग नहीं है।
मिस्टर शाइनी और न्यू 宇 Sh

3
कृपया उस टिप्पणी को पढ़ने के लिए समय लें जिसमें मैंने उनके प्रश्न का स्पष्टीकरण मांगा था। यह उत्तर उस टिप्पणी के उनके उत्तर के उत्तर में है जिसमें उन्होंने कहा था, "मैं एंड्रॉइड पर ऐसा करने की कोशिश कर रहा हूं, लेकिन सभी प्लेटफार्मों पर सभी उत्तर उपयोगी उत्तर होंगे जो संकेत दे सकते हैं (दूसरों को भी जो इस पर आ सकते हैं) सवाल) तो वापस पकड़ नहीं है! मैंने उस टिप्पणी के आधार पर उसके प्रश्न का उत्तर दिया। यदि आपके पास जोड़ने के लिए कुछ भी उपयोगी नहीं है, तो कुछ भी न जोड़ें
चाडएनसी

1
बहुत परेशान मत हो। "यह सवाल का जवाब नहीं देता", IMO जोड़ने के लिए उपयोगी है।
श्री शाइनी और न्यू। Sh

1
यह एंड्रॉइड से कोई फर्क नहीं पड़ता है, सवाल यह है कि स्ट्रिंग युक्त URL को पार्स कैसे करें और इसमें से URL पैरामीटर प्राप्त करें। आप यहां पोर्ट कर रहे हैं, सर्वलेट एपीआई का हिस्सा है, जहां सर्वलेट कंटेनर आपके लिए HTTP अनुरोध से आने वाले मापदंडों को पार्स करता है। यह अप्रासंगिक है, क्योंकि सवाल स्ट्रिंग को पार्स करने के बारे में है जिसमें URL नहीं है, HTTP अनुरोध नहीं है, और सर्वलेट कंटेनर के अंदर नहीं है।
mvmn

5

एंड्रॉयड पर, मैं @diyism जवाब उपयोग करने की कोशिश, लेकिन मैं अंतरिक्ष चरित्र @rpetrich द्वारा उठाए गए मुद्दे, उदाहरण के लिए का सामना करना पड़ा: मैं एक फार्म भरना जहां username = "us+us"और password = "pw pw"तरह देखने के लिए एक URL स्ट्रिंग के कारण:

http://somewhere?username=us%2Bus&password=pw+pw

हालाँकि, @diyism कोड रिटर्न "us+us"और "pw+pw", अर्थात यह अंतरिक्ष वर्ण का पता नहीं लगाता है। यदि URL को फिर से लिखा गया था %20तो अंतरिक्ष वर्ण की पहचान हो जाती है:

http://somewhere?username=us%2Bus&password=pw%20pw

यह निम्नलिखित तय की ओर जाता है:

Uri uri = Uri.parse(url_string.replace("+", "%20"));
uri.getQueryParameter("para1");

replace(" ", "%20")यह गलत लगता है। लेकिन मेरे लिए चाल
चली गई

सही सिंटैक्स "कुछ स्ट्रिंग" होना चाहिए .replaceAll ("[+]", "% 20");
आरआरटीडब्ल्यू

4

क्वेरी स्ट्रिंग को पार्स करना थोड़ा अधिक जटिल है जितना लगता है कि यह इस बात पर निर्भर करता है कि आप कितना क्षमा चाहते हैं।

सबसे पहले, क्वेरी स्ट्रिंग ascii बाइट्स है। आप एक बार में इन बाइट्स में पढ़ते हैं और उन्हें वर्णों में बदलते हैं। अगर चरित्र है? या फिर यह एक पैरामीटर नाम की शुरुआत का संकेत देता है। यदि वर्ण = है, तो यह एक परमार्थ मूल्य की शुरुआत का संकेत देता है। यदि चरित्र% है तो यह एन्कोडेड बाइट की शुरुआत का संकेत देता है। यहाँ है जहाँ यह मुश्किल हो जाता है।

जब आप एक% चार में पढ़ते हैं तो आपको अगले दो बाइट्स को पढ़ना होगा और उन्हें हेक्स अंकों के रूप में व्याख्या करना होगा। इसका मतलब है कि अगले दो बाइट 0-9, एफएफ या एएफ होंगे। अपने बाइट मान को पाने के लिए इन दो हेक्स अंकों को एक साथ गोंद दें। लेकिन याद रखें, बाइट्स अक्षर नहीं हैं । आपको यह जानना होगा कि वर्णों को एन्कोड करने के लिए एन्कोडिंग का क्या उपयोग किया गया था। यह चरित्र UTF-8 में समान नहीं है, क्योंकि यह ISO-8859-1 में है। सामान्य तौर पर यह जानना असंभव है कि किसी दिए गए वर्ण सेट के लिए एन्कोडिंग का उपयोग किया गया था। मैं हमेशा यूटीएफ -8 का उपयोग करता हूं क्योंकि मेरी वेब साइट को यूटीएफ -8 का उपयोग करके हमेशा सब कुछ परोसने के लिए कॉन्फ़िगर किया गया है लेकिन व्यवहार में आप निश्चित नहीं हो सकते। कुछ उपयोगकर्ता-एजेंट आपको अनुरोध में वर्ण एन्कोडिंग बताएंगे; आप यह पढ़ने की कोशिश कर सकते हैं कि यदि आपके पास पूर्ण HTTP अनुरोध है। यदि आपके पास अलगाव में एक यूआरएल है, तो शुभकामनाएं।

वैसे भी, यह मानकर कि आप UTF-8 या किसी अन्य मल्टी-बाइट कैरेक्टर एन्कोडिंग का उपयोग कर रहे हैं, अब जब आपने एक एन्कोडेड बाइट को डिकोड कर लिया है, तो आपको इसे तब तक सेट करना होगा जब तक कि आप अगली बाइट पर कब्जा न कर लें। आपको सभी एन्कोडेड बाइट्स की आवश्यकता होती है जो एक साथ हैं क्योंकि आप एक बार में एक बाइट को ठीक से url-decode नहीं कर सकते हैं। एक साथ सभी बाइट्स को अलग सेट करें और फिर अपने चरित्र को फिर से बनाने के लिए उन सभी को एक साथ डिकोड करें।

इसके अलावा और अधिक मज़ा आता है अगर आप कर्ज़दार होना चाहते हैं और उपयोगकर्ता-एजेंटों के लिए खाता है जो उरल्स का प्रबंधन करते हैं। उदाहरण के लिए, कुछ वेबमेल क्लाइंट चीजों को डबल-एनकोड करते हैं। या डबल अप करें? & = Chars (उदाहरण के लिए:) http://yoursite.com/blah??p1==v1&&p2==v2। यदि आप इससे निपटने का प्रयास करना चाहते हैं, तो आपको अपने पार्सर में अधिक तर्क जोड़ने होंगे।


यह व्याख्या नहीं करता है कि कैसे पैरामीटर मानों को पार्स या पुनः प्राप्त किया जाए
चाडएनसी

सही, लेकिन थोड़ा बोझिल। उसके लिए हमारे पास पहले से URLDecoder है।
BalusC

2
@ChadNC: तीसरा वाक्य आपको पार्स करने का तरीका बताता है: एक समय में एक बाइट में पढ़ा जाता है और चार्ट में बदल जाता है। चौथा वाक्य आपको विशेष वर्ण की चेतावनी देता है। आदि। शायद आपने जवाब नहीं पढ़ा?
श्री चमकदार और न्यू 安

@BalusC: URLDecoder काम करता है, लेकिन इसमें कुछ विफलता मोड हैं यदि आप किस तरह के URL को स्वीकार करने की अधिक कोशिश कर रहे हैं।
श्री चमकदार और न्यू 安

1
@ Mr.hinyAndNew पार्स क्वेरी परम के साथ सहमत होना आसान नहीं है। मैं FIQL का समर्थन कर रहा हूं और यह गधे में एक वास्तविक दर्द बन गया है। उदाहरण के लिए: yoursite.com/blah??p1==v1&&p2==v2,p2==v3;p2==v4
rafa.ferreira

4

नीचे दिए गए कोड के रूप में Android पर इसका सरल:

UrlQuerySanitizer sanitzer = new UrlQuerySanitizer(url);
String value = sanitzer.getValue("your_get_parameter");

यदि आप प्रत्येक अपेक्षित क्वेरी कुंजी उपयोग को पंजीकृत नहीं करना चाहते हैं:

sanitzer.setAllowUnregisteredParamaters(true)

फोन करने से पहले:

sanitzer.parseUrl(yourUrl)

4

मेरे पास इसे प्राप्त करने के तरीके हैं:

1) :

public static String getQueryString(String url, String tag) {
    String[] params = url.split("&");
    Map<String, String> map = new HashMap<String, String>();
    for (String param : params) {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }

    Set<String> keys = map.keySet();
    for (String key : keys) {
        if(key.equals(tag)){
         return map.get(key);
        }
        System.out.println("Name=" + key);
        System.out.println("Value=" + map.get(key));
    }
    return "";
}

2) और ऐसा करने का सबसे आसान तरीका उरी वर्ग का उपयोग करना :

public static String getQueryString(String url, String tag) {
    try {
        Uri uri=Uri.parse(url);
        return uri.getQueryParameter(tag);
    }catch(Exception e){
        Log.e(TAG,"getQueryString() " + e.getMessage());
    }
    return "";
}

और यह दो तरीकों में से किसी का उपयोग करने का एक उदाहरण है:

String url = "http://www.jorgesys.com/advertisements/publicidadmobile.htm?position=x46&site=reform&awidth=800&aheight=120";      
String tagValue = getQueryString(url,"awidth");

TagValue का मान है 800


3

Android पर, आप भारी उठाने के लिए Android.net.Uri वर्ग के Uri.parse स्थैतिक विधि का उपयोग कर सकते हैं । यदि आप URI और इरादों के साथ कुछ भी कर रहे हैं, तो आप इसे वैसे भी उपयोग करना चाहते हैं।


3

बस संदर्भ के लिए, यह वही है जो मैंने पूरा किया है (URLEncodedUtils के आधार पर, और एक नक्शा वापस करके)।

विशेषताएं:

  • यह url के क्वेरी स्ट्रिंग भाग को स्वीकार करता है (आप उपयोग कर सकते हैं request.getQueryString())
  • एक खाली क्वेरी स्ट्रिंग एक खाली उत्पादन करेगा Map
  • एक मान के बिना एक पैरामीटर (? परीक्षण) एक खाली करने के लिए मैप किया जाएगा List<String>

कोड:

public static Map<String, List<String>> getParameterMapOfLists(String queryString) {
    Map<String, List<String>> mapOfLists = new HashMap<String, List<String>>();
    if (queryString == null || queryString.length() == 0) {
        return mapOfLists;
    }
    List<NameValuePair> list = URLEncodedUtils.parse(URI.create("http://localhost/?" + queryString), "UTF-8");
    for (NameValuePair pair : list) {
        List<String> values = mapOfLists.get(pair.getName());
        if (values == null) {
            values = new ArrayList<String>();
            mapOfLists.put(pair.getName(), values);
        }
        if (pair.getValue() != null) {
            values.add(pair.getValue());
        }
    }

    return mapOfLists;
}

एक अनुकूलता सहायक (मान एक स्ट्रिंग सरणी में ServletRequest.getParameterMap () ) में संग्रहीत किए जाते हैं :

public static Map<String, String[]> getParameterMap(String queryString) {
    Map<String, List<String>> mapOfLists = getParameterMapOfLists(queryString);

    Map<String, String[]> mapOfArrays = new HashMap<String, String[]>();
    for (String key : mapOfLists.keySet()) {
        mapOfArrays.put(key, mapOfLists.get(key).toArray(new String[] {}));
    }

    return mapOfArrays;
}

3

यह मेरे लिए काम करता है .. मुझे यकीन नहीं है कि हर एक एक मैप के बाद क्यों था, सूची> मुझे जो कुछ भी चाहिए था वह एक सरल नाम मान मानचित्र था।

चीजों को सरल रखने के लिए मैंने URI.getQuery () में बिल्ड का उपयोग किया;

public static Map<String, String> getUrlParameters(URI uri)
    throws UnsupportedEncodingException {
    Map<String, String> params = new HashMap<String, String>();
    for (String param : uri.getQuery().split("&")) {
        String pair[] = param.split("=");
        String key = URLDecoder.decode(pair[0], "UTF-8");
        String value = "";
        if (pair.length > 1) {
            value = URLDecoder.decode(pair[1], "UTF-8");
        }
        params.put(new String(key), new String(value));
    }
    return params;
}

1
कैसे कई चयन के साथ रूपों के बारे में? इसकी पूरी तरह सामान्य वैध क्वेरी स्ट्रिंग्स (और POST फॉर्म बॉडीज) में बार-बार की चाबियाँ हैं। अन्य दोष हैं और कोने-मामले कवर नहीं किए गए हैं; उनमें से कई अन्य दृष्टिकोणों पर टिप्पणी में उल्लेख किया गया है। मैं प्रपत्र बचना जाएगा डर में उन्हें उनका कहना है कि आप इसे ठीक करने के बजाय मेरी प्रति एक गुणवत्ता लाइब्रेरी का उपयोग, के रूप में शेख़ी ); सवाल में
विल

2

अमरूद का मल्टीमप इसके लिए बेहतर अनुकूल है। यहाँ एक छोटा साफ संस्करण है:

Multimap<String, String> getUrlParameters(String url) {
        try {
            Multimap<String, String> ret = ArrayListMultimap.create();
            for (NameValuePair param : URLEncodedUtils.parse(new URI(url), "UTF-8")) {
                ret.put(param.getName(), param.getValue());
            }
            return ret;
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

1

Apache AXIS2 में QueryStringParser.java का स्व-निहित कार्यान्वयन है। यदि आप Axis2 का उपयोग नहीं कर रहे हैं, तो यहां से सिर्फ सोर्सकोड और टेस्ट केस डाउनलोड करें -

http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/util/QueryStringParser.java

http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/transport/http/util/QueryStringParserTest.java


1

यहां मूल रूप से उत्तर दिया गया है

Android पर, पैकेज Android.net में उरी वर्ग है । ध्यान दें कि Uri android.net का हिस्सा है, जबकि URI java.net का हिस्सा है।

उरी वर्ग में क्वेरी कुंजी-मूल्य जोड़े निकालने के लिए कई कार्य हैं। यहां छवि विवरण दर्ज करें

निम्नलिखित फ़ंक्शन हैशपॉप के रूप में कुंजी-मूल्य जोड़े देता है।

जावा में:

Map<String, String> getQueryKeyValueMap(Uri uri){
    HashMap<String, String> keyValueMap = new HashMap();
    String key;
    String value;

    Set<String> keyNamesList = uri.getQueryParameterNames();
    Iterator iterator = keyNamesList.iterator();

    while (iterator.hasNext()){
        key = (String) iterator.next();
        value = uri.getQueryParameter(key);
        keyValueMap.put(key, value);
    }
    return keyValueMap;
}

कोटलिन में:

fun getQueryKeyValueMap(uri: Uri): HashMap<String, String> {
        val keyValueMap = HashMap<String, String>()
        var key: String
        var value: String

        val keyNamesList = uri.queryParameterNames
        val iterator = keyNamesList.iterator()

        while (iterator.hasNext()) {
            key = iterator.next() as String
            value = uri.getQueryParameter(key) as String
            keyValueMap.put(key, value)
        }
        return keyValueMap
    }

0

मुझे नहीं लगता कि JRE में एक है। आप Apache HttpClient जैसे अन्य पैकेज में समान फ़ंक्शन पा सकते हैं। यदि आप किसी अन्य पैकेज का उपयोग नहीं करते हैं, तो आपको बस अपना स्वयं का लिखना होगा। यह इतना मुश्किल नही है। यहाँ मेरा उपयोग है,

public class QueryString {

 private Map<String, List<String>> parameters;

 public QueryString(String qs) {
  parameters = new TreeMap<String, List<String>>();

  // Parse query string
     String pairs[] = qs.split("&");
     for (String pair : pairs) {
            String name;
            String value;
            int pos = pair.indexOf('=');
            // for "n=", the value is "", for "n", the value is null
         if (pos == -1) {
          name = pair;
          value = null;
         } else {
       try {
        name = URLDecoder.decode(pair.substring(0, pos), "UTF-8");
              value = URLDecoder.decode(pair.substring(pos+1, pair.length()), "UTF-8");            
       } catch (UnsupportedEncodingException e) {
        // Not really possible, throw unchecked
           throw new IllegalStateException("No UTF-8");
       }
         }
         List<String> list = parameters.get(name);
         if (list == null) {
          list = new ArrayList<String>();
          parameters.put(name, list);
         }
         list.add(value);
     }
 }

 public String getParameter(String name) {        
  List<String> values = parameters.get(name);
  if (values == null)
   return null;

  if (values.size() == 0)
   return "";

  return values.get(0);
 }

 public String[] getParameterValues(String name) {        
  List<String> values = parameters.get(name);
  if (values == null)
   return null;

  return (String[])values.toArray(new String[values.size()]);
 }

 public Enumeration<String> getParameterNames() {  
  return Collections.enumeration(parameters.keySet()); 
 }

 public Map<String, String[]> getParameterMap() {
  Map<String, String[]> map = new TreeMap<String, String[]>();
  for (Map.Entry<String, List<String>> entry : parameters.entrySet()) {
   List<String> list = entry.getValue();
   String[] values;
   if (list == null)
    values = null;
   else
    values = (String[]) list.toArray(new String[list.size()]);
   map.put(entry.getKey(), values);
  }
  return map;
 } 
}

अपाचे कक्षाओं के साथ क्या तरीका है?
विल


3
कृपया अपाचे कॉमन्स लिंक को अपने स्वयं के उत्तर में डालें ताकि मैं इसे वोट कर सकूं।
इसकेनाडोक

0

BalusC के उत्तर के आधार पर, मैंने कुछ उदाहरण-जावा-कोड लिखे:

    if (queryString != null)
    {
        final String[] arrParameters = queryString.split("&");
        for (final String tempParameterString : arrParameters)
        {
            final String[] arrTempParameter = tempParameterString.split("=");
            if (arrTempParameter.length >= 2)
            {
                final String parameterKey = arrTempParameter[0];
                final String parameterValue = arrTempParameter[1];
                //do something with the parameters
            }
        }
    }

0
public static Map <String, String> parseQueryString (final URL url)
        throws UnsupportedEncodingException
{
    final Map <String, String> qps = new TreeMap <String, String> ();
    final StringTokenizer pairs = new StringTokenizer (url.getQuery (), "&");
    while (pairs.hasMoreTokens ())
    {
        final String pair = pairs.nextToken ();
        final StringTokenizer parts = new StringTokenizer (pair, "=");
        final String name = URLDecoder.decode (parts.nextToken (), "ISO-8859-1");
        final String value = URLDecoder.decode (parts.nextToken (), "ISO-8859-1");
        qps.put (name, value);
    }
    return qps;
}


0

अमरूद का उपयोग:

Multimap<String,String> parseQueryString(String queryString, String encoding) {
    LinkedListMultimap<String, String> result = LinkedListMultimap.create();

    for(String entry : Splitter.on("&").omitEmptyStrings().split(queryString)) {
        String pair [] = entry.split("=", 2);
        try {
            result.put(URLDecoder.decode(pair[0], encoding), pair.length == 2 ? URLDecoder.decode(pair[1], encoding) : null);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    return result;
}

0

यहाँ उत्तर देना क्योंकि यह एक लोकप्रिय धागा है। यह कोटलिन में एक साफ समाधान है जो अनुशंसित UrlQuerySanitizerएपीआई का उपयोग करता है । आधिकारिक दस्तावेज देखें । मैंने पैरामन्स को समेटने और प्रदर्शित करने के लिए एक स्ट्रिंग बिल्डर जोड़ा है।

    var myURL: String? = null
    // if the url is sent from a different activity where you set it to a value
    if (intent.hasExtra("my_value")) {
        myURL = intent.extras.getString("my_value")
    } else {
        myURL = intent.dataString
    }

    val sanitizer = UrlQuerySanitizer(myURL)
    // We don't want to manually define every expected query *key*, so we set this to true
    sanitizer.allowUnregisteredParamaters = true
    val parameterNamesToValues: List<UrlQuerySanitizer.ParameterValuePair> = sanitizer.parameterList
    val parameterIterator: Iterator<UrlQuerySanitizer.ParameterValuePair> = parameterNamesToValues.iterator()

    // Helper simply so we can display all values on screen
    val stringBuilder = StringBuilder()

    while (parameterIterator.hasNext()) {
        val parameterValuePair: UrlQuerySanitizer.ParameterValuePair = parameterIterator.next()
        val parameterName: String = parameterValuePair.mParameter
        val parameterValue: String = parameterValuePair.mValue

        // Append string to display all key value pairs
        stringBuilder.append("Key: $parameterName\nValue: $parameterValue\n\n")
    }

    // Set a textView's text to display the string
    val paramListString = stringBuilder.toString()
    val textView: TextView = findViewById(R.id.activity_title) as TextView
    textView.text = "Paramlist is \n\n$paramListString"

    // to check if the url has specific keys
    if (sanitizer.hasParameter("type")) {
        val type = sanitizer.getValue("type")
        println("sanitizer has type param $type")
    }

-2

इस विधि के नाम और बराबर मूल्य के uri और वापसी नक्शा लेता है

  public static Map<String, String> getQueryMap(String uri) {

    String queryParms[] = uri.split("\\?");

    Map<String, String> map = new HashMap<>();// 

    if (queryParms == null || queryParms.length == 0) return map;

    String[] params = queryParms[1].split("&");
    for (String param : params) {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }
    return map;
}

1
ऊपर मेरे शेख़ी के अनुसार, यह तुच्छ रूप से दुर्घटनाग्रस्त हो सकता है। फिक्सिंग को परेशान न करें, बस इसके बजाय एक पेशेवर उपयोगिता पुस्तकालय का उपयोग करें।
विल

-3

आप कहते हैं "जावा" लेकिन "जावा ईई" नहीं। क्या आपका मतलब है कि आप JSP और / या सर्वलेट्स का उपयोग कर रहे हैं लेकिन पूर्ण जावा EE स्टैक नहीं? यदि ऐसा है, तो आपको अभी भी request.getParameter () आपके लिए उपलब्ध होना चाहिए।

यदि आपका मतलब है कि आप जावा लिख ​​रहे हैं, लेकिन आप JSP और न ही सर्वलेट नहीं लिख रहे हैं, या आप सिर्फ जावा को अपने संदर्भ बिंदु के रूप में उपयोग कर रहे हैं, लेकिन आप कुछ अन्य प्लेटफॉर्म पर हैं, जिसमें अंतर्निहित पैरामीटर पार्स नहीं है ... वाह , यह सिर्फ एक असंभावित प्रश्न की तरह लगता है, लेकिन यदि ऐसा है, तो सिद्धांत होगा:

xparm=0
word=""
loop
  get next char
  if no char
    exit loop
  if char=='='
    param_name[xparm]=word
    word=""
  else if char=='&'
    param_value[xparm]=word
    word=""
    xparm=xparm+1
  else if char=='%'
    read next two chars
    word=word+interpret the chars as hex digits to make a byte
  else
    word=word+char

(मैं जावा कोड लिख सकता हूं, लेकिन यह व्यर्थ होगा, क्योंकि यदि आपके पास जावा उपलब्ध है, तो आप बस request.getararers का उपयोग कर सकते हैं।)


वर्ण एन्कोडिंग के लिए बाहर देखो जब url- डिकोडिंग हेक्स अंक।
श्री चमकदार और न्यू 安

यह Android है, इसलिए जावा है लेकिन J2EE नहीं है।
डोयले

मैं उल्लेख करना भूल गया: आपको "+" के लिए भी जांचना होगा, जिसका अनुवाद किसी स्थान पर किया जाना चाहिए। एंबेडेड स्पेस एक क्वेरी स्ट्रिंग में अवैध हैं।
जे।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.