Estoy tratando con una plataforma heredada que no comprende los parámetros codificados en URL.
Tengo los siguientes parámetros
params = {'fiz': 'foo:bar', 'biz': 'barfoo'}
URL generada por solicitudes
http://localhost/?fiz=foo%3Abar&biz=barfoo
URL requerida para la plataforma heredada
http://localhost/?fiz=foo:bar&biz=barfoo
Intenté crear una cadena de consulta personalizada y agregarla a la URL, sin embargo, las solicitudes decodificarán esta consulta y la volverán a codificar.
improt urllib
qry = urllib.urlencode(params).replace('%3A', ':')
requests.get(url+'?'+qry) #: requests encodes the colon back to %3A
¿Hay alguna solución rápida que no parezca tan detallada como usar urllib2 directo?
Si es posible obtener una lista "segura" o "reemplazar" conectada a la API, esto debería hacerse en la capa de solicitudes, ya que se requiere Python 2.7.
Esto es un poco incómodo de hacer en Solicitudes. Como yo lo veo, tienes dos opciones. La primera es preparar los objetos Request
usted mismo:
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)
Su otra opción sería crear un Adaptador de transporte que mute las URL antes de enviarlas, así:
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)
Recomiendo la primera opción.
puede probar el parámetro json de las solicitudes.post () y las solicitudes.get () http://stackoverflow.com/a/26344315/1056345
Comentario más útil
Esto es un poco incómodo de hacer en Solicitudes. Como yo lo veo, tienes dos opciones. La primera es preparar los objetos
Request
usted mismo:Su otra opción sería crear un Adaptador de transporte que mute las URL antes de enviarlas, así: