<p>solicitações forçam a substituição da codificação da string de consulta</p>

Criado em 11 jul. 2013  ·  3Comentários  ·  Fonte: psf/requests

Estou lidando com uma plataforma legada que não entende os parâmetros codificados de URL.

Eu tenho os seguintes parâmetros

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

url gerado por pedidos

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

url necessária para a plataforma legada

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

Tentei criar uma string de consulta personalizada e adicioná-la ao url, mas as solicitações irão decodificar essa consulta e recodificá-la.

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

Existe alguma solução rápida que não parece tão prolixa quanto usar o urllib2 direto?

Se for possível obter uma lista "segura" ou "substituída" ligada à API, isso precisa ser feito na camada de solicitações, pois o python 2.7 é necessário.

Comentários muito úteis

Isso é um pouco estranho de fazer em Solicitações. A meu ver, você tem duas opções. A primeira é preparar você mesmo os objetos 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)

Sua outra opção seria construir um adaptador de transporte que modifique os URLs antes de enviá-los, da seguinte forma:

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 comentários

Isso é um pouco estranho de fazer em Solicitações. A meu ver, você tem duas opções. A primeira é preparar você mesmo os objetos 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)

Sua outra opção seria construir um adaptador de transporte que modifique os URLs antes de enviá-los, da seguinte forma:

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)

Eu recomendo a primeira opção.

você pode tentar o parâmetro json de requests.post () e requests.get () http://stackoverflow.com/a/26344315/1056345

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

8key picture 8key  ·  3Comentários

everping picture everping  ·  4Comentários

jake491 picture jake491  ·  3Comentários

cnicodeme picture cnicodeme  ·  3Comentários

avinassh picture avinassh  ·  4Comentários