<p>solicitudes forzar anular la codificación de la cadena de consulta</p>

Creado en 11 jul. 2013  ·  3Comentarios  ·  Fuente: psf/requests

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.

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:

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)

Todos 3 comentarios

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

¿Fue útil esta página
0 / 5 - 0 calificaciones