जावा में URL क्वेरी पैरामीटर एन्कोडिंग


108

जावा में एक यूआरएल पर जाने के लिए क्वेरी पैरामीटर को कैसे एन्कोड किया जाता है? मुझे पता है, यह एक स्पष्ट और पहले से ही पूछा गया प्रश्न लगता है।

दो सूक्ष्मताएँ हैं जिनके बारे में मुझे यकीन नहीं है:

  1. क्या रिक्त स्थान को "+" या "% 20" के रूप में url पर एन्कोड किया जाना चाहिए? क्रोम में अगर मैं "http://google.com/foo=?bar me" टाइप करता हूँ तो क्रोम इसे% 20 के साथ एनकोड किया जा सकता है
  2. क्या कॉलन को एनकोड करना आवश्यक / सही है ":"% 3B के रूप में? Chrome नहीं करता है

टिप्पणियाँ:

  • java.net.URLEncoder.encodeकाम करने के लिए प्रतीत नहीं होता है, यह डेटा को एन्कोडिंग करने के लिए प्रस्तुत किया जाना प्रतीत होता है। उदाहरण के लिए, यह +इसके बजाय स्थान को एन्कोड करता है %20, और कोलन को एन्कोड करता है जो आवश्यक नहीं है।
  • java.net.URI क्वेरी मापदंडों को एनकोड नहीं करता है

यह सवाल उपयोगी लगता है: stackoverflow.com/questions/444112/…
एलेक्स ब्लैक

2
क्वेरी भाग की संरचना सर्वर-निर्भर है, हालांकि अधिकांश application/x-www-form-urlencodedकुंजी / मान जोड़े की अपेक्षा करते हैं । और अधिक देखने के लिए यहां देखें: illegalargumentexception.blogspot.com/2009/12/…
McDowell

जवाबों:


127

java.net.URLEncoder.encode(String s, String encoding)मदद भी कर सकते हैं। यह HTML फॉर्म एन्कोडिंग का अनुसरण करता है application/x-www-form-urlencoded

URLEncoder.encode(query, "UTF-8");

दूसरी ओर, प्रतिशत-एन्कोडिंग ( URL एन्कोडिंग के रूप में भी जाना जाता है ) के साथ अंतरिक्ष को एनकोड करता है %20। बृहदान्त्र एक आरक्षित चरित्र है, इसलिए :एन्कोडिंग के बाद भी एक बृहदान्त्र रहेगा।


3
मैंने उल्लेख किया कि मुझे नहीं लगा कि यह एन्कोडिंग करता है, इसके बजाय यह प्रपत्र के माध्यम से प्रस्तुत किए जाने वाले डेटा को एन्कोड करता है। टिप्पणियाँ?
एलेक्स ब्लैक

ऐसा इसलिए URLEncoderहै क्योंकि application/x-www-form-urlencodedMIME प्रारूप (जो एक मान्य HTML फॉर्म एन्कोडिंग है) के अनुरूप है । मैं मान रहा हूँ कि तुम क्या नहीं देख रहे हो।
बुहके सिंडी

6
मैंने URLEncoder.encode का उपयोग करते हुए "%" की जगह "% 20" का उपयोग किया
एलेक्स ब्लैक

2
यह स्लैश को "% 2F" में एन्कोड करता है, क्या इसे URL स्लैश को नहीं छोड़ना चाहिए जैसे वे हैं?
गोलिमार ३१'१३

6
@ गोलिमार नहीं, यह नहीं होना चाहिए। आप इसे केवल पूरे URL का पैरामीटर मान देने वाले हैं। उदाहरण पर विचार करें http://example.com/?url=http://example.com/?q=c&sort=name। यह सांकेतिक शब्दों में बदलना चाहिए &sort=nameया नहीं? URL से मान को अलग करने का कोई तरीका नहीं है। यह सटीक कारण है कि आपको पहले स्थान पर मूल्य एन्कोडिंग की आवश्यकता क्यों है।
पीजूस

15

संपादित करें: URIUtilअब और अधिक हाल के संस्करणों में उपलब्ध नहीं है, जावा में बेहतर जवाब - URL को एनकोड करें या इस धागे में श्री सिंडी द्वारा।


URIUtilअपाचे httpclient वास्तव में उपयोगी है, हालांकि कुछ विकल्प हैं

URIUtil.encodeQuery(url);

उदाहरण के लिए, यह "% 20" के बजाय "+" के रूप में स्थान घेरता है

दोनों सही संदर्भ में पूरी तरह से मान्य हैं । यद्यपि यदि आप वास्तव में पसंद करते हैं तो आप एक स्ट्रिंग प्रतिस्थापन जारी कर सकते हैं।


मुझे सहमत होना होगा। HttpClient का उपयोग करें, आप बहुत खुश होंगे।
Dahahaun

यह आशाजनक लग रहा है, मौका से एक लिंक मिला? मैं गुगली कर रहा हूं, लेकिन बहुतों को ढूंढ रहा हूं।
एलेक्स ब्लैक

1
यह विधि HttpClient 4.1 में मौजूद नहीं है? hc.apache.org/httpcompenders-client-ga/httpclient/apidocs/org/…
एलेक्स ब्लैक

@ एलेक्स, हम्म जो परेशान कर रहा है, मैंने हमेशा अच्छे परिणामों के साथ उस दिनचर्या का उपयोग किया है। एक विचार 3 रिलीज से स्रोत कोड को हथियाने का है क्योंकि वे अब स्पष्ट रूप से इसे बनाए नहीं रखना चाहते थे।
जोहान Sjöberg

1
URIUtil.encodeWithinQueryवह है जो आप एक व्यक्तिगत क्वेरी पैरामीटर एनकोड का उपयोग करेंगे, जो कि मूल प्रश्न पूछ रहा है।
जेसी ग्लिक

13

दुर्भाग्य से, URLEncoder.encode () मान्य प्रतिशत-एन्कोडिंग ( RFC 3986 में निर्दिष्ट) का उत्पादन नहीं करता है ।

URLEncoder.encode () सब कुछ ठीक करता है, सिवाय इसके कि अंतरिक्ष "+" के लिए एन्कोडेड है। सभी जावा यूआरआई एन्कोडर्स जिन्हें मैं केवल क्वेरी, टुकड़ा, पथ भागों आदि को एन्कोड करने के लिए सार्वजनिक तरीकों को उजागर कर सकता था - लेकिन "कच्चे" एन्कोडिंग को उजागर नहीं करता। यह दुर्भाग्यपूर्ण है क्योंकि टुकड़ा और क्वेरी को अंतरिक्ष को + में एन्कोड करने की अनुमति है, इसलिए हम उनका उपयोग नहीं करना चाहते हैं। पथ ठीक से एन्कोडेड है, लेकिन "सामान्यीकृत" पहले है इसलिए हम इसे 'जेनेरिक' एन्कोडिंग के लिए उपयोग नहीं कर सकते हैं।

सबसे अच्छा समाधान मैं साथ आ सकता है:

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");

अगर आप के replaceAll()लिए बहुत धीमी है, मुझे लगता है कि विकल्प के लिए अपने स्वयं के एनकोडर रोल है ...

संपादित करें: मेरा यह कोड यहाँ पहले था जो "एनकोड नहीं करता है?", "&", "=" ठीक से:

//don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);

+किसी स्थान का पूरी तरह से मान्य एन्कोडिंग है।
लॉरेंस डोल

@ लॉरेंसडोल यह सच है लेकिन कभी-कभी +गलत तरीके से व्याख्या की जा सकती है - सी # ब्लॉगs.msdn.microsoft.com/yangxind/2006/11/08/…
Lu55

यह। मैंने जावास्क्रिप्ट के encodeURIComponentविधि आउटपुट के खिलाफ विभिन्न विकल्पों की तुलना की , और यह उन लोगों के लिए एकमात्र सटीक मिलान था जो मैंने कोशिश की थी (रिक्त स्थान, तुर्की और जर्मन विशेष वर्णों के साथ प्रश्न)।
उत्क्कू

8

क्वेरी में% 3B के रूप में एक बृहदान्त्र को एनकोड करना आवश्यक नहीं है, हालांकि ऐसा करना अवैध नहीं है।

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

यह भी लगता है कि केवल प्रतिशत-एन्कोड किए गए स्थान मान्य हैं, क्योंकि मुझे संदेह है कि अंतरिक्ष एक अल्फा या एक DIGIT है

करने के लिए लग रही है यूआरआई विनिर्देश अधिक जानकारी के लिए।


लेकिन ऐसा करना URI के अर्थ को बदल सकता है, क्योंकि क्वेरी स्ट्रिंग की व्याख्या सर्वर तक है। यदि आप एक application/x-www-form-urlencodedक्वेरी स्ट्रिंग बना रहे हैं, तो या तो ठीक है। यदि आप एक ऐसा URL तय कर रहे हैं जिसे उपयोगकर्ता ने टाइप किया / चिपकाया, :तो उसे अकेला छोड़ दिया जाना चाहिए।
टीसी

@tc। आप सही हैं, यदि बृहदान्त्र को एक सामान्य सीमांकक (RFC के पृष्ठ 12) के रूप में उपयोग किया जा रहा है; हालाँकि, यदि इसे सामान्य सीमांकक के रूप में उपयोग नहीं किया जा रहा है, तो दोनों एन्कोडिंग को पहचान के रूप में हल करना चाहिए।
एडविन बक

आपको सावधान रहना होगा क्योंकि URL वास्तव में URI का एक उपसमूह नहीं हैं: adamgent.com/post/25161273526/urls-are-not-a-subset-of-uris
एडम जेंट

5

जावा URLEncoder में निर्मित वही कर रहा है जो इसे माना जाता है, और आपको इसका उपयोग करना चाहिए।

किसी URL में स्पेस कैरेक्टर के लिए "+" या "% 20" दोनों मान्य प्रतिस्थापन हैं। या तो कोई काम करेगा।

एक ":" को एन्कोड किया जाना चाहिए, क्योंकि यह एक विभाजक चरित्र है। यानी http: // foo या ftp: // बार । तथ्य यह है कि एक विशेष ब्राउज़र इसे संभाल सकता है जब यह एन्कोड नहीं होता है तो यह सही नहीं बनाता है। आपको उनका एनकोड करना चाहिए।

अच्छे अभ्यास के रूप में, उस विधि का उपयोग करना सुनिश्चित करें जो एक चरित्र एन्कोडिंग पैरामीटर लेता है। UTF-8 का उपयोग आम तौर पर वहां किया जाता है, लेकिन आपको इसे स्पष्ट रूप से आपूर्ति करना चाहिए।

URLEncoder.encode(yourUrl, "UTF-8");

5
+में केवल अंतरिक्ष का प्रतिनिधित्व है application/x-www-form-urlencoded; यह HTTP पर प्रतिबंधित होने पर भी काम करने की गारंटी नहीं है। इसी तरह, क्वेरी स्ट्रिंग में: मान्य है और इसे परिवर्तित नहीं किया जाना चाहिए%3B ; एक सर्वर उन्हें अलग तरीके से व्याख्या करने के लिए चुन सकता है।
टीसी

1
इस विधि भी पूरे यूआरएल स्लैश और अन्य पात्रों कौन सा हिस्सा उदा सांकेतिक शब्दों में बदलना http://करने के लिए http%3A%2F%2Fजो सही नहीं है
करने के लिए क्रा

2
@ToKra आप http://भाग को एनकोड करने वाले नहीं हैं । विधि क्वेरी पैरामीटर और एन्कोडेड फॉर्म डेटा के लिए है। यदि, हालाँकि, आप किसी अन्य वेबसाइट के URL को एक क्वेरी पैरामीटर के रूप में पास करना चाहते हैं, तो आप URL पार्सर को भ्रमित करने से बचने के लिए इसे एन्कोड करना चाहेंगे।
बेलाडज़

@tc के मेरे पढ़ने w3.org/TR/html4/interact/forms.html#h-17.13.3.3 कि सभी प्राप्त प्रपत्र डेटा के रूप में इनकोडिंग है application/x-www-form-urlencodedसामग्री प्रकार। क्या इसका मतलब HTTP के लिए काम नहीं करना चाहिए?
बेलाजज

0

अगर आपको url में केवल स्पेस की समस्या है। मैंने नीचे दिए गए कोड का उपयोग किया है और यह ठीक काम करता है

String url;
URL myUrl = new URL(url.replace(" ","%20"));

उदाहरण: url है

www.xyz.com?para=hello सर

तब muUrl का आउटपुट होता है

www.xyz.com?para=hello%20sir


0
String param="2019-07-18 19:29:37";
param="%27"+param.trim().replace(" ", "%20")+"%27";

मैंने देखा कि कामटाइम (टाइमस्टैम्प) के मामले में URLEncoder.encode(param,"UTF-8")काम नहीं करता है।

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