كيفية إنشاء معلمات الاستعلام في جافا سكريبت؟

StackOverflow https://stackoverflow.com/questions/111529

  •  02-07-2019
  •  | 
  •  

سؤال

هل هناك أي طريقة لإنشاء معلمات الاستعلام للقيام أ الحصول على الطلب في جافا سكريبت؟

تمامًا كما هو الحال في بايثون لديك urllib.urlencode(), ، الذي يأخذ قاموسًا (أو قائمة مكونة من صفين) وينشئ سلسلة مثل 'var1=value1&var2=value2'.

هل كانت مفيدة؟

المحلول

ها أنت ذا:

function encodeQueryData(data) {
   const ret = [];
   for (let d in data)
     ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
   return ret.join('&');
}

الاستخدام:

const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);

نصائح أخرى

وظيفي

function encodeData(data) {
    return Object.keys(data).map(function(key) {
        return [key, data[key]].map(encodeURIComponent).join("=");
    }).join("&");
}   

زابا لقد قدمت في تعليق على الإجابة المقبولة حاليًا اقتراحًا هو الحل الأفضل بالنسبة لي:يستخدم مسج.param().

إذا كنت تستخدم jQuery.param() على البيانات الموجودة في السؤال الأصلي، فإن الكود ببساطة هو:

const params = jQuery.param({
    var1: 'value',
    var2: 'value'
});

المتغير params سوف يكون

"var1=value&var2=value"

للحصول على أمثلة أكثر تعقيدًا، المدخلات والمخرجات، راجع مسج.param() توثيق.

URLSearchParams لديه دعم متزايد للمتصفح.

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = new URLSearchParams(data);

// searchParams.toString() === 'var1=value1&var2=value2'

يقدم Node.js querystring وحدة.

const querystring = require('querystring');

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = querystring.stringify(data);

// searchParams === 'var1=value1&var2=value2'

لقد أطلقنا سراحنا للتو arg.js, وهو مشروع يهدف إلى حل هذه المشكلة بشكل نهائي.لقد كان الأمر صعبًا جدًا تقليديًا ولكن الآن يمكنك القيام بما يلي:

var querystring = Arg.url({name: "Mat", state: "CO"});

وأعمال القراءة:

var name = Arg("name");

أو الحصول على كامل المبلغ:

var params = Arg.all();

وإذا كنت تهتم بالفرق بين ?query=true و #hash=true ثم يمكنك استخدام Arg.query() و Arg.hash() طُرق.

هذا ينبغي أن يقوم بالمهمة:

const createQueryParams = params => 
      Object.keys(params)
            .map(k => `${k}=${encodeURI(params[k])}`)
            .join('&');

مثال:

const params = { name : 'John', postcode: 'W1 2DL'}
const queryParams = createQueryParams(params)

نتيجة:

name=John&postcode=W1%202DL

إذا كنت تستخدم النموذج المبدئي هنالك Form.serialize

إذا كنت تستخدم مسج هنالك اياكس/تسلسل

لا أعرف أي وظائف مستقلة لإنجاز ذلك، لكن البحث في Google عنها أظهر بعض الخيارات الواعدة إذا كنت لا تستخدم مكتبة حاليًا.إذا لم تكن كذلك، فيجب عليك فعلًا لأنها الجنة.

تمامًا مثل إعادة النظر في هذا السؤال الذي مضى عليه 10 سنوات تقريبًا.في عصر البرمجة الجاهزة هذا، أفضل رهان لك هو إعداد مشروعك باستخدام مدير التبعية (npm).هناك صناعة منزلية كاملة من المكتبات التي تقوم بتشفير سلاسل الاستعلام وتعتني بجميع حالات الحافة.هذه واحدة من أكثر شعبية -

https://www.npmjs.com/package/query-string

إي إس 2017 (ES8)

الاستفادة من Object.entries(), ، والتي تقوم بإرجاع مجموعة من الكائنات [key, value] أزواج.على سبيل المثال، ل {a: 1, b: 2} سيعود [['a', 1], ['b', 2]].إنه غير مدعوم (ولن يكون) بواسطة IE فقط.

شفرة:

const buildURLQuery = obj =>
      Object.entries(obj)
            .map(pair => pair.map(encodeURIComponent).join('='))
            .join('&');

مثال:

buildURLQuery({name: 'John', gender: 'male'});

نتيجة:

"name=John&gender=male"

تعديل بسيط على الكتابة:

  public encodeData(data: any): string {
    return Object.keys(data).map((key) => {
      return [key, data[key]].map(encodeURIComponent).join("=");
    }).join("&");
  }

هذا خيط يشير إلى بعض التعليمات البرمجية للهروب من عناوين URL في php.هناك escape() و unescape() والتي سوف تقوم بمعظم العمل، ولكنك تحتاج إلى إضافة بعض الأشياء الإضافية.

function urlencode(str) {
str = escape(str);
str = str.replace('+', '%2B');
str = str.replace('%20', '+');
str = str.replace('*', '%2A');
str = str.replace('/', '%2F');
str = str.replace('@', '%40');
return str;
}

function urldecode(str) {
str = str.replace('+', ' ');
str = unescape(str);
return str;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top