2014-02-17 10 views
10

ich folgenden Python-Skript geschrieben habe, Python-Anfragen unter Verwendung von (http://requests.readthedocs.org/en/latest/):Use% 20 anstelle von + für Raum in Python Abfrage-Parameter

import requests 

payload = {'key1': 'value 1', 'key2': 'value 2'} 
headers = {'Content-Type': 'application/json;charset=UTF-8'} 
r = requests.get("http://example.com/service", params=payload, headers=headers, 
      auth=("admin", "password")) 

Wenn ich auf dem Zugriffsprotokoll des Servers suchen, die eingehenden Anfrage: /service key1 = Wert ++ 1 & key2 = Wert + 2

jedoch der Server erwartet ... value%20%201& ...

ich gelesen habe, dass ein + als Platzhalter verwendet für ein Raum ist Teil von Inhaltstyp Anwendung/x-www-form-urlencoded, aber klar habe ich beantragt/json.

Kann jemand% 20 als Leerzeichen in Abfrageparametern von Pythons-Anfragen verwenden?

+0

Haben Sie das jemals gelöst? Bist du einfach mit 'urllib' gegangen, oder änderst du den Server oder sowas? –

+0

Ich weiß es ehrlich gesagt nicht mehr. Vor einiger Zeit, und ich habe keinen Zugriff mehr auf die Quellen –

+0

Ich bin immer noch auf diesem fest. Bummer – Bryce

Antwort

0

Ich finde nur urllib.parse.quote, der Raum zu %20 ersetzen kann.

Aber quote konnte ein Diktat nicht konvertieren.

Also, wir müssen quote verwenden, um dict im Voraus zu transformieren.


#for python3 
from urllib.parse import quote 

payload = {'key1': 'value 1', 'key2': 'value 2'} 

newpayload = {} 
for (k, v) in payload.items(): 
    newpayload[quote(k)] = quote(v) 
print(newpayload) 
#print result: {'key1': 'value%20%201', 'key2': 'value%202'} 
# Now, you can use it in requests 
+1

Austauschen von Leerzeichen für% 20 in meiner Nutzlast versucht. Der Anfrage-Parser und die URL haben dann die Prozentzeichen codiert, so dass "dieser% 20that" zu "this% 2520that" wurde - also YMMV. – YiddishNinja

0

scheint dies ein bekannter Fehler/Problem in Python zu sein:

http://bugs.python.org/issue13866

Ich denke, Sie, um dieses Problem gehen müssen mit urllib und urllib2 und Anfragen zu vermeiden. Sehen Sie sich die Fehlerberichte an, um einige Tipps dazu zu erhalten.

0

Wir urllib2.Request URL aufrufen können

import urllib2 

send_params = {'key1': 'value 1', 'key2': 'value 2'} 
new_send_params = [] 
for (k, v) in send_params.items(): 
    new_send_params.append(k + "=" + urllib2.quote(v)) 

url = 'http://example.com/service?'+ '&'.join(new_send_params) 
req = urllib2.Request(url) 
response = urllib2.urlopen(req) 
print "Request URL: " + url 
#Request URL: http://example.com/service?key1=value%20&key2=value%202 
print response.read() 
#Python Master Request handler 2016-07-04 16:05:19.928132 . Your request path is /service?key1=value%20&key2=value%202 
2

auf @ der WeaselFox Antwort auf Follow-up, führten sie einen Patch, der ein quote_via Stichwort Argument urllib.parse.urlencode akzeptiert. Jetzt könnten Sie das tun:

import requests 
import urllib 

payload = {'key1': 'value 1', 'key2': 'value 2'} 
headers = {'Content-Type': 'application/json;charset=UTF-8'} 
params = urllib.parse.urlencode(payload, quote_via=urllib.parse.quote) 
r = requests.get("http://example.com/service", params=params, headers=headers, 
    auth=("admin", "password")) 
Verwandte Themen