<p>طلبات فرض تجاوز ترميز سلسلة الاستعلام</p>

تم إنشاؤها على ١١ يوليو ٢٠١٣  ·  3تعليقات  ·  مصدر: psf/requests

إنني أتعامل مع نظام أساسي قديم لا يفهم معلمات 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)

ال 3 كومينتر

هذا أمر محرج بعض الشيء في الطلبات. كما أراه ، لديك خياران. الأول هو تحضير كائنات 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

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات