إنني أتعامل مع نظام أساسي قديم لا يفهم معلمات URL المشفرة.
لدي المعلمات التالية
params = {'fiz': 'foo:bar', 'biz': 'barfoo'}
تم إنشاء عنوان url عن طريق الطلبات
http://localhost/?fiz=foo%3Abar&biz=barfoo
مطلوب url للمنصة القديمة
http://localhost/?fiz=foo:bar&biz=barfoo
لقد حاولت إنشاء سلسلة استعلام مخصصة وإضافتها إلى عنوان url ، ولكن الطلبات ستفك تشفير هذا الاستعلام وتعيد ترميزه.
improt urllib
qry = urllib.urlencode(params).replace('%3A', ':')
requests.get(url+'?'+qry) #: requests encodes the colon back to %3A
هل هناك أي حل سريع لا يبدو مطولًا مثل استخدام urllib2 المستقيم؟
هل من الممكن الحصول على قائمة "آمنة" أو "استبدال" مرتبطة بواجهة برمجة التطبيقات ، فهذا يجب أن يتم في طبقة الطلبات حيث أن بيثون 2.7 مطلوب.
هذا أمر محرج بعض الشيء في الطلبات. كما أراه ، لديك خياران. الأول هو تحضير كائنات Request
بنفسك:
import requests
import urllib
url = 'http://test.com/'
qry = urllib.urlencode(params).replace('%3A', ':')
s = requests.Session()
req = requests.Request(method='GET', url=url)
prep = req.prepare()
prep.url = url + qry
r = s.send(prep)
سيكون خيارك الآخر هو إنشاء محول نقل يغير عناوين URL قبل إرسالها ، مثل:
import requests
import urllib
class MutatingAdapter(requests.adapters.HTTPAdapter):
def send(self, request, **kwargs):
main, querystr = request.url.split('?') # Nasty hack, not always valid.
querystr = urllib.unquote(querystr)
querystr = urllib.quote(querystr, '/&:=')
request.url = '?'.join([main, querystr])
super(MutatingAdapter, self).send(request, **kwargs)
أوصي الخيار الأول.
يمكنك تجربة المعامل json الخاص بالطلبات .post () و request.get () http://stackoverflow.com/a/26344315/1056345
التعليق الأكثر فائدة
هذا أمر محرج بعض الشيء في الطلبات. كما أراه ، لديك خياران. الأول هو تحضير كائنات
Request
بنفسك:سيكون خيارك الآخر هو إنشاء محول نقل يغير عناوين URL قبل إرسالها ، مثل: