<p>demandes forcer le remplacement de l'encodage de la chaîne de requête</p>

Créé le 11 juil. 2013  ·  3Commentaires  ·  Source: psf/requests

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.

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 :

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)

Tous les 3 commentaires

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

Cette page vous a été utile?
0 / 5 - 0 notes