<p>fordert das Überschreiben der Codierung der Abfragezeichenfolge erzwingen an</p>

Erstellt am 11. Juli 2013  ·  3Kommentare  ·  Quelle: psf/requests

Ich habe es mit einer Legacy-Plattform zu tun, die URL-codierte Parameter nicht versteht.

Ich habe folgende Parameter

params = {'fiz': 'foo:bar', 'biz': 'barfoo'}

URL generiert durch Anfragen

http://localhost/?fiz=foo%3Abar&biz=barfoo

erforderliche URL für die Legacy-Plattform

http://localhost/?fiz=foo:bar&biz=barfoo

Ich habe versucht, eine benutzerdefinierte Abfragezeichenfolge zu erstellen und diese der URL hinzuzufügen, jedoch werden Anforderungen diese Abfrage dekodieren und neu kodieren.

improt urllib
qry = urllib.urlencode(params).replace('%3A', ':')
requests.get(url+'?'+qry) #: requests encodes the colon back to %3A

Gibt es eine schnelle Lösung, die nicht so ausführlich aussieht wie die Verwendung von Straight urllib2?

Ist es möglich, eine "sichere" oder "ersetzen"-Liste in die API einzubinden, müsste dies auf der Anforderungsebene erfolgen, da Python 2.7 erforderlich ist.

Hilfreichster Kommentar

Dies ist in Anfragen etwas umständlich. Aus meiner Sicht hast du zwei Möglichkeiten. Die erste besteht darin, die Request Objekte selbst vorzubereiten:

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)

Ihre andere Möglichkeit wäre, einen Transportadapter zu erstellen, der die URLs vor dem Senden mutiert, wie folgt:

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)

Alle 3 Kommentare

Dies ist in Anfragen etwas umständlich. Aus meiner Sicht hast du zwei Möglichkeiten. Die erste besteht darin, die Request Objekte selbst vorzubereiten:

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)

Ihre andere Möglichkeit wäre, einen Transportadapter zu erstellen, der die URLs vor dem Senden mutiert, wie folgt:

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)

Ich empfehle die erste Möglichkeit.

Sie könnten den json-Parameter von request.post() und request.get() http://stackoverflow.com/a/26344315/1056345 ausprobieren

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen