URL पैरामीटर को कैसे एनकोड करें?


123

मैं एक URL के मापदंडों को पास करने की कोशिश कर रहा हूं जो इस तरह दिखता है:

http://www.foobar.com/foo?imageurl=

और मैं उन मापदंडों को पारित करना चाहता हूं जैसे कि एक छवि URL जो स्वयं किसी अन्य एपीआई द्वारा उत्पन्न होता है, और छवि के लिए लिंक इस प्रकार है:

http://www.image.com/?username=unknown&password=unknown

हालाँकि, जब मैं URL का उपयोग करने का प्रयास करता हूं:

http://www.foobar.com/foo?imageurl=http://www.image.com/?username=unknown&password=unknown

यह काम नहीं करता है।

मैंने भी imageURL पर encodeURI()और प्रयोग करने की कोशिश की है encodeURIComponent(), और वह भी काम नहीं करता है।


URL किस भाषा का निर्माण कर रहा है? जावास्क्रिप्ट?
फिल

2
ध्यान दें कि आपको यूआरएल में पासवर्ड नहीं डालना चाहिए, यहां तक ​​कि https का उपयोग करते समय भी नहीं, क्योंकि क्लाइंट और सर्वर के बीच प्रत्येक राउटर को पूरा यूआरएल दिखाई देगा।
fabb

जवाबों:


171

PHP के साथ

echo urlencode("http://www.image.com/?username=unknown&password=unknown");

परिणाम

http%3A%2F%2Fwww.image.com%2F%3Fusername%3Dunknown%26password%3Dunknown

जावास्क्रिप्ट के साथ:

var myUrl = "http://www.image.com/?username=unknown&password=unknown";
var encodedURL= "http://www.foobar.com/foo?imageurl=" + encodeURIComponent(myUrl);

डेमो: http://jsfiddle.net/Lpv53/


37

नई ES6 का उपयोग करना Object.entries(), यह एक मजेदार थोड़ा नेस्ट के लिए बनाता है map/ join:

const encodeGetParams = p => 
  Object.entries(p).map(kv => kv.map(encodeURIComponent).join("=")).join("&");

const params = {
  user: "María Rodríguez",
  awesome: true,
  awesomeness: 64,
  "ZOMG+&=*(": "*^%*GMOZ"
};

console.log("https://example.com/endpoint?" + encodeGetParams(params))


1

आप का उपयोग नहीं किया जाना चाहिए encodeURIComponent()या encodeURI()। आपको MDN प्रलेखन के अनुसार, का उपयोग करना चाहिए fixedEncodeURIComponent()और fixedEncodeURI()

के बारे में encodeURI()...

यदि कोई URL के लिए अधिक हाल के RFC3986 का अनुसरण करना चाहता है, जो वर्ग कोष्ठक (IPv6 के लिए) आरक्षित करता है और इस प्रकार एन्कोड नहीं किया जाता है, तो ऐसा कुछ बनता है जो URL का हिस्सा हो सकता है (जैसे होस्ट), निम्न कोड स्निपेट मदद कर सकता है:

function fixedEncodeURI(str) { return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']'); }

के बारे में encodeURIComponent()...

RFC 3986 (जो आरक्षित है ?,, (,),), और *) का पालन करने में अधिक कठोर होने के लिए, भले ही इन वर्णों में कोई औपचारिक यूआरआई परिसीमन उपयोग न हो, निम्नलिखित सुरक्षित रूप से उपयोग किया जा सकता है:

function fixedEncodeURIComponent(str) { return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { return '%' + c.charCodeAt(0).toString(16); }); }

तो अंतर क्या है? fixedEncodeURI()और fixedEncodeURIComponent()मूल्यों के एक ही सेट को fixedEncodeURIComponent()परिवर्तित करें , लेकिन इस सेट को भी रूपांतरित करता है +@?=:*#;,$&:। यह सेट GETपैरामीटर ( &और +, आदि), एंकर टैग ( #), वाइल्डकार्ड टैग ( *), ईमेल / उपयोगकर्ता नाम भागों ( @), आदि में उपयोग किया जाता है।

उदाहरण के लिए - यदि आप उपयोग करते हैं encodeURI(), तो संगतता को संभालने वाले आपके ब्राउज़र को छोड़कर, सर्वर पर user@example.com/?email=me@homeदूसरे @को ठीक से नहीं भेजेंगे (जैसा कि क्रोम स्वाभाविक रूप से अक्सर करता है)।


आपका क्या मतलब है "except for your browser handling the compatibility"?
Stephan

@Stephan: उदाहरण के लिए, यदि site.com?formula=a+b=cउत्पादन में formula=>a+b=cकाम करता है, तो यह युक्ति का उल्लंघन करता है, लेकिन अगर यह काम करता है, तो यह क्रोम / आदि है। URL इत्यादि की असफलता का पता लगा सकते हैं, और इसी तरह, w / user@site.com?email=user@site.com
होल्डऑफहुंगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.