J'ai affaire à une plate-forme héritée qui ne comprend pas les paramètres encodés d'URL.
j'ai les paramètres suivants
params = {'fiz': 'foo:bar', 'biz': 'barfoo'}
URL générée par les requêtes
http://localhost/?fiz=foo%3Abar&biz=barfoo
URL requise pour l'ancienne plate-forme
http://localhost/?fiz=foo:bar&biz=barfoo
J'ai essayé de créer une chaîne de requête personnalisée et de l'ajouter à l'URL, mais les requêtes décoderont cette requête et la réencoderont.
improt urllib
qry = urllib.urlencode(params).replace('%3A', ':')
requests.get(url+'?'+qry) #: requests encodes the colon back to %3A
Existe-t-il une solution de contournement rapide qui ne semble pas aussi détaillée que l'utilisation d'urllib2 direct ?
est-il possible d'obtenir une liste "sûre" ou "remplacer" accrochée à l'API, cela devrait être fait au niveau de la couche de requêtes car python 2.7 est requis.
C'est un peu difficile à faire dans les requêtes. Selon moi, vous avez deux options. La première consiste à préparer vous-même les objets 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)
Votre autre option serait de créer un adaptateur de transport qui mute les URL avant de les envoyer, comme ceci :
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)
Je recommande la première option.
vous pouvez essayer le paramètre json de request.post () et request.get () http://stackoverflow.com/a/26344315/1056345
Commentaire le plus utile
C'est un peu difficile à faire dans les requêtes. Selon moi, vous avez deux options. La première consiste à préparer vous-même les objets
Request
:Votre autre option serait de créer un adaptateur de transport qui mute les URL avant de les envoyer, comme ceci :