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.
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
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
:Sua outra opção seria construir um adaptador de transporte que modifique os URLs antes de enviá-los, da seguinte forma: