URL AJAX अनुरोध के लिए jQuery में एक स्ट्रिंग एनकोड करें


217

मैं अपने आवेदन में Google का त्वरित खोज लागू कर रहा हूं। मैं पाठ इनपुट में उपयोगकर्ता प्रकारों के रूप में HTTP अनुरोधों को बंद करना चाहूंगा। मेरे पास एकमात्र समस्या यह है कि जब उपयोगकर्ता पहले और अंतिम नामों के बीच एक स्थान पर पहुंच जाता है, तो अंतरिक्ष को एन्कोडिंग नहीं किया जाता है +, इस प्रकार खोज को तोड़ दिया जाता है। मैं या तो एक के साथ अंतरिक्ष को कैसे बदल सकता हूं +, या बस सुरक्षित रूप से URL एनकोड करें स्ट्रिंग?

$("#search").keypress(function(){       
    var query = "{% url accounts.views.instasearch  %}?q=" + $('#tags').val();
    var options = {};
    $("#results").html(ajax_load).load(query);
});

आप उपयोग कर सकते हैं $.param
jpaugh

जवाबों:


490

एन्कोडर्कोम्पोनेंट की कोशिश करें ।

एक निश्चित, दो, तीन, या चार एस्केप अनुक्रमों के प्रत्येक उदाहरण को वर्ण के UTF-8 एन्कोडिंग द्वारा दर्शाते हुए एक समान संसाधन पहचानकर्ता (URI) घटक को एनकोड करता है (दो सरोगेट से बने वर्णों के लिए केवल चार एस्केप सीक्वेंस होंगे) " पात्र)।

उदाहरण:

var encoded = encodeURIComponent(str);

2
इससे मेरी समस्या हल हो गई - जब मैं एक URL में अपने AJAX अनुरोध के पैरामीटर के रूप में गुजर रहा था, तो URL इसमें किसी भी क्वेरी स्ट्रिंग के लिए और उसके बाद सब कुछ खो रहा था। जब मैंने इसे जोड़ा, तो मेरी समस्या हल हो गई। धन्यवाद!
TheJerm

21

encodeURIComponent मेरे लिए ठीक काम करता है। हम इस तरह ajax कॉल में url दे सकते हैं। नीचे दिखाया गया कोड:

  $.ajax({
    cache: false,
    type: "POST",
    url: "http://atandra.mivamerchantdev.com//mm5/json.mvc?Store_Code=ATA&Function=Module&Module_Code=thub_connector&Module_Function=THUB_Request",
    data: "strChannelName=" + $('#txtupdstorename').val() + "&ServiceUrl=" + encodeURIComponent($('#txtupdserviceurl').val()),
    dataType: "HTML",
    success: function (data) {
    },
    error: function (xhr, ajaxOptions, thrownError) {
    }
  });

9

बेहतर तरीका:

एनकोडर्कोम्पोनेंट निम्नलिखित को छोड़कर सभी वर्णों से बच जाता है:alphabetic, decimal digits, - _ . ! ~ * ' ( )

सर्वर से अनपेक्षित अनुरोधों से बचने के लिए, आपको किसी भी उपयोगकर्ता द्वारा दर्ज किए गए मापदंडों पर एन्कोडर्कोम्पोनेंट को कॉल करना चाहिए जो एक यूआरआई के भाग के रूप में पारित किया जाएगा। उदाहरण के लिए, एक उपयोगकर्ता एक चर टिप्पणी के लिए "थाइम और समय = फिर से" टाइप कर सकता है। इस चर पर एन्कोडर्कोम्पोनेंट का उपयोग नहीं करने पर टिप्पणी = थाइम% 20 और समय = फिर से मिलेगा। ध्यान दें कि एम्परसेंड और बराबर चिह्न एक नई कुंजी और मूल्य जोड़ी को चिह्नित करते हैं। इसलिए "थाइम & टाइम = फिर से" के बराबर एक POST टिप्पणी कुंजी होने के बजाय, आपके पास दो POST कुंजी हैं, एक "Thyme" के बराबर और दूसरा (समय) फिर से बराबर।

आवेदन / x-www-form-urlencoded (POST) के लिए, http://www.w3.org/TR/html401/interac...m-content-type के अनुसार , रिक्त स्थान को '+' द्वारा प्रतिस्थापित किया जाना है, इसलिए एक "+" के साथ "% 20" के अतिरिक्त प्रतिस्थापन के साथ एक एन्कोडर्कोम्पोनेंट प्रतिस्थापन का पालन करना चाह सकता है।

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

function fixedEncodeURIComponent (str) {
  return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}

1
For application/x-www-form-urlencoded (POST), per http://www.w3.org/TR/html401/interac...m-content-type, spaces are to be replaced by '+', so one may wish to follow a encodeURIComponent replacement with an additional replacement of "%20" with "+".कोई इसे कैसे करता है?
विंस क्रोनलिन

1
लेकिन इसके लिए उपयोगी होने के लिए एक urldecode समकक्ष होना चाहिए
श्री हीलिस

5

मैं बैक-एंड के रूप में MVC3 / EntityFramework का उपयोग कर रहा हूं, फ्रंट-एंड मेरे सभी प्रोजेक्ट कंट्रोलरों को jquery के माध्यम से खपत करता है, सीधे पोस्ट ($ .post) का उपयोग करके डेटा एनक्रिप्शन की आवश्यकता नहीं होती है, जब आप URL हार्डकोड के मुकाबले सीधे params पास करते हैं। मैंने पहले से ही कई वर्णों का परीक्षण किया था, मैंने एक URL भी भेजा था (यह एक http://www.ihackforfun.eu/index.php?title=update-on-url-crazy&more=1&c=1&tb1-1&pb=1 ) एक पैरामीटर के रूप में था और था। जब आप URL में सभी डेटा (हार्डकोड) में पास करते हैं, तब भी कोई समस्या नहीं होती है

Hardcoded URL यानी>

 var encodedName = encodeURIComponent(name);
 var url = "ControllerName/ActionName/" + encodedName + "/" + keyword + "/" + description + "/" + linkUrl + "/" + includeMetrics + "/" + typeTask + "/" + project + "/" + userCreated + "/" + userModified + "/" + status + "/" + parent;; // + name + "/" + keyword + "/" + description + "/" + linkUrl + "/" + includeMetrics + "/" + typeTask + "/" + project + "/" + userCreated + "/" + userModified + "/" + status + "/" + parent;

अन्यथा एन्कोडर्कोम्पोनेंट का उपयोग न करें और इसके बजाय अजाक्स पोस्ट विधि के भीतर पैरामेट्स पास करने का प्रयास करें

 var url = "ControllerName/ActionName/";   
 $.post(url,
        { name: nameVal, fkKeyword: keyword, description: descriptionVal, linkUrl: linkUrlVal, includeMetrics: includeMetricsVal, FKTypeTask: typeTask, FKProject: project, FKUserCreated: userCreated, FKUserModified: userModified, FKStatus: status, FKParent: parent },
 function (data) {.......});

3
यह शायद उस समय एक बेहतर समाधान था :)
ब्रायन डी

0

इसको आजमाओ

var query = "{% url accounts.views.instasearch  %}?q=" + $('#tags').val().replace(/ /g, '+');

5
एंडर्स फेजेलडस्टेड का समाधान कहीं बेहतर है। प्लस संकेतों के साथ रिक्त स्थान बदलना काम कर सकता है, लेकिन यदि आपके पास अन्य अक्षर (ओमलैट्स आदि के साथ) हैं, तो आप परेशानी के ढेर में जा रहे हैं।
उकु लोसित

1
@Uku: ओपी व्हाट्सएप को + से बदलना चाहता था इसलिए मैंने उसे जवाब दिया कि यह कैसे करना है। एनकोडरिकम्पोनेंट उसे 20%
उत्पत्ति

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