2017-07-14 1 views
3

Ich versuche, eine HTTP-Put mit urllib2 tun.Python Fehler zu PUT mit urllib2

Der Server Admin sagte ich brauche die Daten in folgendem Format zur Verfügung zu stellen: { "type": "store", "data": [ "9953"]}

Mein Code ist wie folgt:

url = 'https://url.com/polling/v1/5cb401c5-bded-40f8-84bb-6566cdeb3dbb/stores' 
request = urllib2.Request(url, data='{\"type\":\"store\",\"data\":[\"9953\"]}') 
request.add_header("Authorization", "Basic %s" % creds) 
request.add_header("Content-type", "application/json") 
request.add_header("Accept", "application/json") 
print "Data: %s" % request.get_data() 
print "Accept: %s" % request.get_header("Accept") 
print "Content-Type: %s" % request.get_header("Content-type") 
print "Authorization: %s" % request.get_header("Authorization") 
try: 
    result = urllib2.urlopen(request, data) 
except urllib2.HTTPError as e: 
    print e.read() 
    exit() 
data = json.loads(result.read()) 
print data 

Mein Ausgang, wenn ich laufe dies:

Data: {"type":"store","data":["9953"]} 
Accept: application/json 
Content-Type: application/json 
Authorization: Basic U1lTQ1RMOmFiYzEyMw== 

welche genau das, was ich

senden wurde gesagt,

Aber ich bin immer folgende Fehlermeldung:

BWEB000065: HTTP Status 400 - org.codehaus.jackson.JsonParseException: Unexpected end-of-input: expected close marker for ARRAY (from [Source: org.jboss.resteasy.co[email protected]695dd38d; line: 2, column: 15]) 

Jede Hilfe würde geschätzt.

+1

Warum fliehen Sie doppelte Anführungszeichen (") innerhalb von einfachen Anführungszeichen (') (L2?) – Mark

+0

Die App-Administrator sagte mir zu "stellen Sie sicher, dass Sie ordnungsgemäß Ihre doppelten Anführungszeichen entkommen." Das Entfernen der Escapezeichen führt zu den gleichen Ergebnissen. – user1864311

Antwort

2

Hinweis diese 2 Zeilen Code:

request = urllib2.Request(url, data='{\"type\":\"store\",\"data\":[\"9953\"]}') 

result = urllib2.urlopen(request, data) 

In der ersten Zeile, die Sie initialisieren die Anforderung, indem die auf die JSON Nutzlast gesetzt data benannte Parameter. Dies scheint korrekt zu sein.

Die zweite Zeile wird jedoch in data übergeben und überschreibt die Payload, die Sie in der ersten Zeile initialisiert haben. Ich nehme an, dass data hier eine Variable im größeren Kontext Ihres Programms ist (nicht in der ursprünglichen Frage gezeigt), und dass diese data Variable auf einen anderen Wert gesetzt ist, vielleicht eine ungültige JSON-Nutzlast.

Wenn die Nutzlast in der ersten Zeile korrekt initialisiert wird, dann schlage ich die zweite Zeile dieses zu ändern:

result = urllib2.urlopen(request)