تكرار السؤال: …
الإجابة المختصرة
لأنها ترمّز المعاملات بشكل صحيح (المسافات و & و = والحروف العربية)، وتفصل أجزاء العنوان بأمان، بينما الدمج اليدوي يكسر العناوين وقد يفتح ثغرات.
الشرح
إذا احتوت قيمة من المستخدم على & أو # فستفسد الدمج اليدوي بنية العنوان أو تحقن معاملات إضافية. تبني urlencode سلسلة الاستعلام بترميز سليم، و urlsplit و parse_qs تفككان العناوين للقراءة. تقوم مكتبات HTTP مثل httpx و requests بذلك تلقائيًا عبر params=. لا تضع الأسرار أو التوكنات في الـ URL لأنها تُسجل في السجلات والـ proxies؛ ضعها في الـ headers.
مثال بالكود
from urllib.parse import urlencode, urlsplit, parse_qs
params = {"q": "قهوة & شاي", "page": 2}
url = "https://api.example.com/search?" + urlencode(params)
# ...search?q=%D9%82...+%26+...&page=2
parts = urlsplit(url)
print(parse_qs(parts.query)["q"]) # ['قهوة & شاي']أخطاء شائعة
- تركيب الـ URL بـ f-string مع مدخلات المستخدم مباشرة.
- تمرير API key في query string بدل header.