لقد خسرت ساعة واحدة بسبب سلسلة استعلام. تم إرسال خطاف ويب تابع لجهة خارجية filter[status]=open&filter[assignee]=me، كان معالجي يقرأ filter كسلسلة مسطحة، ولم أتمكن من معرفة سبب عدم تصفية كل طلب. في اللحظة التي قمت فيها بلصق عنوان URL الأولي في محلل سلسلة استعلام ورأيته يتحول إلى كائن متداخل، كان الخطأ واضحًا: استخدم المرسل تدوين الأقواس ولم يفعل المحلل اللغوي. يغطي هذا الدليل كيفية استخدامي لـ محلل سلسلة الاستعلام في Toolz.dev، ما هي الأجزاء الصعبة من سلاسل الاستعلام في الواقع، ولماذا يمكن لنفس المفتاح المشفر بطريقتين مختلفتين أن يكسر التكامل بهدوء.
ليرة تركية؛DR: سلسلة الاستعلام هي جزء من عنوان URL بعد علامة الاستفهام التي تحمل المعلمات كأزواج قيمة المفتاح. يقوم محلل سلسلة الاستعلام بتحويل ذلك إلى JSON منظم، وفك تشفير النسبة المئوية ومعالجة المفاتيح المتكررة ومصفوفات الأقواس، ويمكنه إنشاء سلسلة استعلام مشفرة بشكل صحيح من JSON. ال محلل سلسلة الاستعلام هل كلا الاتجاهين في متصفحك، حتى تتمكن من فحص عنوان URL الفوضوي أو تجميع عنوان URL نظيف دون مغادرة الصفحة.
ما هي سلسلة الاستعلام؟
سلسلة الاستعلام هي قسم من عنوان URL الذي يبدأ بعد علامة الاستفهام الأولى وينتهي عند الجزء، الجزء الذي يلي التجزئة. يحمل المعلمات كما key=value أزواج متصلة بعلامات الضم، لذلك ?q=json&page=2 يمر معلمتين. تقرأ الخوادم ورمز العميل تلك التي تقوم بتصفية بحث أو تتبع حملة أو ترقيم صفحات قائمة أو حمل الحالة بين الصفحات. القواعد العامة لما هو قانوني وما هو غير قانوني في هذا المكون تأتي من RFC 3986، معيار URI، والقواعد المحددة التي تتبعها المتصفحات لمعلمات نمط النموذج تأتي من معيار عنوان URL لـ WHATWG.
المشكلة هي أن RFC 3986 يحدد بناء جملة مكون الاستعلام ولكن ليس معناه. فهو يوضح الأحرف المسموح بها وكيف يجب تشفيرها بنسبة مئوية، لكنه لا يذكر شيئًا عن كيفية ذلك key=value يتم تعيين الأزواج إلى بنية البيانات. تم توريث هذا التفسير من تقديم نموذج HTML، وقامت منصات مختلفة بتوسيعه بطرق غير متوافقة. ولهذا السبب يمكن أن تعني سلسلة الاستعلام نفسها أشياء مختلفة قليلاً عن الواجهة الخلفية لـ PHP، ووحدة تحكم Rails، والواجهة الأمامية لـ JavaScript، ولماذا يتعين على المحلل اللغوي أن يجعل اصطلاحاته واضحة.
يتم تشفير كل مفتاح وقيمة في سلسلة الاستعلام بعنوان URL بحيث تبقى الأحرف المحجوزة على قيد الحياة. تصبح المساحة %20 أو علامة الجمع، تصبح علامة الضم داخل القيمة %26 لذلك لا يتم الخلط بينه وبين فاصل، وتصبح الشرطة المائلة %2F. التحليل يعني تقسيم الأزواج ثم فك تشفير كل جانب، والبناء يعني تشفير كل جانب وضم الأزواج. الحصول على التشفير خاطئ في أي من الاتجاهين والقيم فاسدة بصمت.
ماذا يفعل محلل سلسلة الاستعلام بالفعل؟
يأخذ المحلل اللغوي عنوان URL أو سلسلة استعلام مجردة ويحولها إلى بيانات منظمة وقابلة للقراءة. في الطريقة التي يقوم بها بتجريد كل شيء حتى علامة الاستفهام بما في ذلك، يتجاهل الجزء بعد التجزئة، ويقسم الأزواج، ويفك تشفير كل مفتاح وقيمة، ويقرر كيفية تمثيل المفاتيح المتكررة والمفاتيح بين قوسين. الإخراج عبارة عن كائن JSON يمكنك قراءته ونسخه، بالإضافة إلى جدول مسطح لكل زوج تم فك تشفيره بحيث تكون التكرارات والقيم الفارغة واضحة.
في Toolz.dev، تعمل الأداة في اتجاهين. في وضع التحليل، يمكنك لصق عنوان URL كامل أو سلسلة الاستعلام الخاصة به فقط والحصول على JSON وجدول المعلمات. في وضع البناء، تقوم بلصق كائن JSON والحصول على سلسلة استعلام مشفرة بشكل صحيح، مع اختيار كيفية تمثيل المصفوفات. قم بتحميل العينة ويمكنك مشاهدة عنوان URL حقيقي يحتوي على جزء ومصفوفة ذات نمط متكرر ومساحة مشفرة يتم تحويلها إلى JSON نظيف، ثم أعد بنائها.
السبب وراء استخدام محلل مخصص بدلاً من النظر إلى عنوان URL هو أن سلاسل الاستعلام تخفي بنيتها. يكاد يكون من المستحيل قراءة عنوان URL الطويل الذي يحتوي على أحرف مشفرة ومفاتيح متكررة وتدوين الأقواس بشكل صحيح عن طريق مسحه ضوئيًا، والأجزاء التي يصعب قراءتها والتشفير والنسخ المكررة هي بالضبط الأجزاء التي تسبب الأخطاء. رؤية الجدول الذي تم فك تشفيره بجوار JSON يزيل التخمين.
كيف يتم التعامل مع المفاتيح المتكررة؟
يمكن أن يظهر نفس المفتاح بشكل قانوني أكثر من مرة في سلسلة الاستعلام، كما في tags=react&tags=laravel، ولا توجد طريقة واحدة صحيحة لتفسير ذلك، وهو السبب الجذري للكثير من الالتباس. تعمل الأنظمة المختلفة على حل التكرارات بشكل مختلف، لذا يجب على المحلل اللغوي أن يسمح لك بالاختيار.
الاصطلاح الأكثر شيوعًا، والإعداد الافتراضي في أداة Toolz.dev، هو جمع المفاتيح المتكررة في مصفوفة، لذا tags=react&tags=laravel يصبح {"tags":["react","laravel"]}. يتطابق هذا مع الطريقة التي يمتلك بها المتصفح '؛s URLSearchParams.getAll يكشف القيم وكيفية تصرف معظم الأطراف الخلفية الحديثة. لكن بعض أطر العمل تحتفظ فقط بالحدث الأول والبعض الآخر يحتفظ فقط بالحدث الأخير، لذا توفر الأداة خيارات الاحتفاظ أولاً والاحتفاظ بالأخير أيضًا. عندما تقوم بتصحيح أخطاء التكامل، فإن مطابقة سلوك المحلل اللغوي '؛s للنظام الذي أنتج عنوان URL أو يستهلكه هو ما يجعل JSON ذا معنى.
هذا الغموض ليس أكاديميا. توجد مشكلة أمان وصحة كلاسيكية تسمى تلوث معلمة HTTP على وجه التحديد لأنه يمكن حل نظامين في مسار الطلب id=1&id=2 وبشكل مختلف، يرى المرء 1 والآخر يرى 2. إن القدرة على رؤية كيفية قيام محلل معين بحل التكرارات بشكل صريح هي أسرع طريقة للتفكير في هذه الفئة من الأخطاء.
ماذا تعني الأقواس مثل العلامات [] أو مرشح [اللون]؟
تدوين القوس هو اصطلاح لتشفير المصفوفات والكائنات المتداخلة داخل سلسلة استعلام مسطحة، وهو المكان الذي يختلف فيه المحللون أكثر من غيرهم. قوس فارغ لاحق يشير إلى مصفوفة، لذلك tags[]=react&tags[]=laravel يبني {"tags":["react","laravel"]}. قوس مسمى يشير إلى كائن متداخل، لذلك filter[color]=red&filter[size]=l يبني {"filter":{"color":"red","size":"l"}}. الأقواس يمكن أن تعشش، لذلك a[b][c]=1 يبني {"a":{"b":{"c":"1"}}}.
يأتي بناء الجملة هذا من كيفية قيام PHP وRuby on Rails بتسلسل بيانات النموذج والعديد من مكتبات JavaScript مثل qs اتبعه. إنه ليس جزءًا من أي معيار URL أساسي، وهذا هو بالضبط سبب كونه عاديًا URLSearchParams في المتصفح لن يتم توسيعه، مما يمنحك مفتاحًا حرفيًا لـ tags[] بدلا من المصفوفة. يفهم المحلل اللغوي Toolz.dev الاصطلاح ويوسعه إلى البنية المطابقة، ويتيح لك إيقاف تشغيل هذا السلوك عندما تريد المفاتيح الحرفية بدلاً من ذلك.
فيما يلي كيفية اصطفاف الاتفاقيات الرئيسية، سواء عند التحليل أو عند البناء
| نمط المصفوفة | مشفرة ك | يوزع على | مشترك في |
|---|---|---|---|
| مفتاح متكرر | tags=a&tags=b |
["a","b"] |
المتصفحات، معظم الأطراف الخلفية |
| قوس فارغ | tags[]=a&tags[]=b |
["a","b"] |
مكتبة PHP، القضبان، qs |
| قوس مفهرس | tags[0]=a&tags[1]=b |
["a","b"] |
مكتبة QS، البيانات المطلوبة |
| انضمت فاصلة | tags=a,b |
سلسلة واحدة للانقسام | بعض واجهات برمجة التطبيقات وعناوين URL المدمجة |
عندما تقوم بإنشاء سلسلة استعلام باستخدام الأداة، فإنك تختار أيًا منها سيتم إصداره، بحيث يتطابق الإخراج مع ما يتوقعه نظام الاستقبال. عند التحليل، تكتشف الأداة المفاتيح المتكررة وتدوين الأقواس لك، وتبقى القيم المرتبطة بفواصل كسلسلة واحدة لأنك وحدك من يعرف ما إذا كانت الفاصلة فاصلًا أم جزءًا من البيانات.
لماذا تتحول علامات الزائد إلى مسافات؟
في سلسلة الاستعلام الخاصة بعنوان URL، غالبًا ما يتم ترميز المساحة الحرفية كعلامة زائد بدلاً من ذلك %20. هذه قاعدة موروثة من application/x-www-form-urlencoded التنسيق الذي تستخدمه نماذج HTML، و معيار عنوان URL لـ WHATWG يقننها: عند تحليل البيانات المشفرة بالنموذج، أ + يتم فك تشفيرها إلى الفضاء. لذا q=json+parser ينبغي التحليل ل json parserوتقوم أداة Toolz.dev بذلك بشكل افتراضي.
الدقة هي أن هذه القاعدة تنطبق على مكون الاستعلام، وليس على المسار. أ + في مقطع المسار توجد علامة زائد حرفية. وأحيانًا تحتوي بياناتك بشكل حقيقي على علامات زائد يجب الحفاظ عليها، مثل رقم الهاتف أو البحث عنه C++. في تلك الحالات، تحتوي الأداة على مفتاح لإيقاف تشغيل علامة الزائد كمسافة، وبالتالي تبقى علامة الزائد على قيد الحياة أثناء الرحلة ذهابًا وإيابًا. هذا هو نوع التفاصيل التي هي لأغراض عامة تشفير URL لن تقرر لك، لأنها لا تعرف ما إذا كانت تنظر إلى استعلام أم مسار.
الحصول على هذا الأمر الصحيح مهم عند البناء أيضًا. عندما تقوم الأداة بتشفير قيمة ما، فإنها تقوم بتشفير الأحرف المحجوزة بنسبة مئوية، وتستخدم بشكل افتراضي علامة زائد للمسافات في النمط المشفر بالنموذج، وبالتالي فإن السلسلة التي تنتجها هي السلسلة التي ستقوم المتصفحات والأطراف الخلفية بفك تشفيرها بالطريقة التي تريدها.
كيف يختلف هذا عن محلل URL الكامل؟
يتداخل محلل سلسلة الاستعلام ومحلل URL الكامل ولكنهما يجيبان على أسئلة مختلفة، واستخدام السؤال الصحيح يحفظ الخطوة. يقوم محلل URL بتقسيم رابط كامل إلى مكوناته والمخطط والمضيف والمنفذ والمسار والاستعلام والجزء، وهو ما تريده عندما تقوم بتصحيح الأخطاء في المكان الذي يتجه إليه الطلب أو لماذا تتصرف عملية إعادة التوجيه أو فحص CORS بشكل غريب. يركز محلل سلسلة الاستعلام على الاستعلام وحده ويحوله إلى JSON منظم وقابل للتحرير، بما في ذلك المصفوفات والمفاتيح المتداخلة، ويمكنه إعادة إنشاء الاستعلام مرة أخرى.
ال محلل URL في Toolz.dev هي أداة التشريح: أعطها رابطًا وستعرض لك تمييز المضيف مقابل الأصل، والمنفذ الافتراضي، وأجزاء المسار. محلل سلسلة الاستعلام هو أداة العمل مع المعلمات: أعطه نفس الرابط ويعطيك المعلمات مثل JSON التي يمكنك تحريرها، ثم إعادة بناء سلسلة استعلام من تعديلاتك. من الناحية العملية، أستخدمها معًا، محلل URL لفهم الرابط ومحلل سلسلة الاستعلام لتغيير معلماته، وإذا كنت أقوم بتجميع رابط حملة، فإنني أصل إلى منشئ UTM بدلاً من ذلك، وهو منشئ سلسلة استعلام متخصص في علامات التحليلات.
متى أصل فعلا لهذا؟
الإجابة الصادقة هي عندما يقوم عنوان URL بأكثر من مجرد الإشارة إلى الصفحة. أستخدمه لتصحيح أخطاء خطافات الويب وإعادة توجيه OAuth، حيث تحمل المعلمات الحمولة الكاملة وتكسر قيمة واحدة مشفرة بشكل خاطئ التدفق. أستخدمه لقراءة معلمات التتبع على رابط تسويقي حتى أتمكن من رؤية ما تمر به الحملة بالضبط. أستخدمه لتحويل سلسلة استعلام قام زميل بلصقها في الدردشة إلى JSON، ويمكنني الانتقال إلى أداة اختبار، وللقيام بالعكس، وتحويل كائن صغير إلى سلسلة استعلام لطلب يدوي سريع.
مثال عملي يجعل المكافأة ملموسة. يقوم موفر OAuth بإعادة التوجيه مرة أخرى إلى تطبيقك بشيء من هذا القبيل ?code=abc123&state=xyz789&scope=read%20write&error=. تم لصقه في المحلل اللغوي، والذي يتحول إلى كائن نظيف: code و state كقيمهم الحرفية، scope فك التشفير إلى read write لأن %20 هو الفضاء، و error كسلسلة فارغة بدلاً من مفتاح مفقود، مما يخبرك أن الموفر أرسل المعلمة لكنه تركها فارغة. عند قراءة ذلك من عنوان URL الأولي بالعين المجردة، فمن المحتمل أن تفوتك المساحة المشفرة scope وأخطأت في قراءة الفارغ error، وكلاهما بالضبط التفاصيل التي تحدد ما إذا كان معالج رد الاتصال الخاص بك يتفرع بشكل صحيح. تؤدي رؤية الجدول الذي تم فك تشفيره إلى إزالة الغموض، وإذا كنت بحاجة بعد ذلك إلى إعادة إنتاج الطلب، فإن وضع البناء يعيد الكائن الذي تم تحريره مرة أخرى إلى عنوان URL صالح لرد الاتصال في خطوة واحدة.
نظرًا لأن الكثير من هذا العمل يتضمن عناوين URL التي تحمل الرموز المميزة والقيم الموقعة ومعرفات التتبع، فإن القيام بذلك في أداة تعمل بالكامل في متصفحك أمر مهم. لا يتم نقل أي شيء تقوم بلصقه أو تسجيله أو تخزينه، وتستمر الأداة في العمل مع الشبكة، حتى تتمكن من فحص عنوان URL لرد الاتصال الموقع بأمان من الإنتاج بدلاً من نسخة منقحة. أقدم الحجة الأوسع للحفاظ على هذا النوع من العمل من جانب العميل في خصوصية البيانات في الأدوات عبر الإنترنت الدليل، وهذا المحلل اللغوي موجود بجانب الرابط والأدوات المساعدة النصية الأخرى التي وصفتها في مجموعة أدوات مطور الويب. إذا كان جزء من وظيفتك هو تحويل الإدخال الفوضوي إلى slugs ومعرفات نظيفة، فإن Slug مولد هو رفيق طبيعي لجانب الإخراج من عمل URL.
الأسئلة المتداولة
ما هي سلسلة الاستعلام؟
سلسلة الاستعلام هي جزء من عنوان URL بعد علامة الاستفهام التي تحمل المعلمات كأزواج قيمة رئيسية متصلة بعلامات الضم، مثل ؟q=json&؛ صفحة=2. تقرأه الخوادم ورمز العميل لتصفية النتائج أو تتبع الحملات أو تمرير الحالة. يتم ترميز كل مفتاح وقيمة بعنوان URL بحيث تبقى المسافات والأحرف المحجوزة، ولا يكون الجزء بعد التجزئة جزءًا منه.
كيف يتم التعامل مع المفاتيح المتكررة عند التحليل؟
افتراضيًا، يتم دمج المفتاح الذي يظهر أكثر من مرة في مصفوفة، لذا يتم توزيع العلامات=react&؛tags=laravel إلى {"؛tags"؛:["؛react"؛،"؛laravel"؛]}. يمكنك التبديل للاحتفاظ بالقيمة الأولى فقط أو القيمة الأخيرة فقط بدلاً من ذلك، لأن الأطراف الخلفية المختلفة تحل التكرارات بشكل مختلف وتريد أن يتطابق JSON مع النظام الذي تستهدفه.
ماذا تعني الأقواس مثل العلامات [] أو مرشح [اللون]؟
يقوم تدوين القوس بتشفير المصفوفات والكائنات المتداخلة داخل سلسلة استعلام مسطحة. العلامات []=react&؛tags[]=laravel يبني مصفوفة، ثم يقوم بالتصفية [color]=red&؛filter[size]=l يبني الكائن المتداخل {"؛filter"؛:{"؛color"؛:"؛red"؛،"؛size"؛:"؛l"؛}}. إنه شائع في مكتبات PHP وRails والنماذج، لذا يقوم المحلل اللغوي بتوسيعه إلى البنية المطابقة، ويمكنك إيقاف تشغيله للاحتفاظ بالمفاتيح الحرفية.
لماذا تصبح علامة الزائد مساحة؟
في سلسلة الاستعلام الخاصة بعنوان URL، غالبًا ما يتم تشفير المساحة الحرفية كعلامة زائد، وهي قاعدة موروثة من إرسال نموذج HTML، لذلك يقوم المحلل اللغوي بتحويل + مرة أخرى إلى مساحة افتراضيًا. إذا كانت بياناتك تحتوي على علامات زائد حقيقية يجب الاحتفاظ بها، مثل C++ أو رقم هاتف، فأوقف تشغيل خيار زائد كمسافة وسيتم الاحتفاظ بالعلامة الزائد.
هل يمكنني إنشاء سلسلة استعلام من JSON؟
نعم. قم بالتبديل لإنشاء الوضع ولصق كائن JSON من أزواج قيمة المفتاح. تقوم النسبة المئوية للأداة بتشفير كل مفتاح وقيمة وربطهما بعلامات الضم، ويمكنك اختيار كيفية تشفير المصفوفات: المفاتيح المتكررة، أو الأقواس الفارغة، أو الأقواس المفهرسة، أو قائمة مفصولة بفواصل، بحيث يتطابق الإخراج مع كل ما يتوقعه نظام الاستقبال.
ما الفرق بين هذا ومحلل URL الكامل؟
يقوم محلل عنوان URL الكامل بتقسيم عنوان URL بالكامل إلى مخطط ومضيف ومنفذ ومسار واستعلام وجزء. يركز محلل سلسلة الاستعلام على الاستعلام وحده، ويحوله إلى JSON منظم قابل للتحرير بما في ذلك المصفوفات والمفاتيح المتداخلة، ويمكنه إعادة إنشاء الاستعلام مرة أخرى. استخدم محلل URL لفحص الارتباط، وهذه الأداة لقراءة معلماته أو تغييرها.
هل يتعامل مع عنوان URL كامل أم جزء الاستعلام فقط؟
كلاهما. إذا قمت بلصق عنوان URL كامل، فسيقوم المحلل بإسقاط كل شيء حتى علامة الاستفهام ويتضمنها ويتجاهل الجزء بعد التجزئة، حتى تحصل على المعلمات فقط. إذا قمت بلصق سلسلة استعلام مجردة بدون علامة استفهام، فسيتم تحليلها كما هي، وهو أمر مفيد عند نسخ المعلمات فقط.
هل يتم إرسال عنوان URL الخاص بي إلى أي مكان؟
رقم. يتم تشغيل كل من التحليل وفك التشفير والتشفير كجافا سكريبت في متصفحك، لذلك لا يتم نقل أي شيء أو تسجيله أو تخزينه. يمكنك تأكيد ذلك من خلال مشاهدة علامة تبويب الشبكة أثناء تحليل عنوان URL، أو عن طريق قطع الاتصال بالإنترنت، لأن الأداة تستمر في العمل دون اتصال بمجرد تحميل الصفحة.
فحص أو تجميع المعلمات مجانًا محلل سلسلة الاستعلام. يقوم بتوزيع عنوان URL إلى JSON وإنشاء سلسلة استعلام مرة أخرى، والتعامل مع المفاتيح المتكررة، ومصفوفات الأقواس، والتشفير، بالكامل في متصفحك.



