2017-03-08 8 views
0

Ich schreibe eine kleine Python 2.x App, die Bilder von URLs ergreift, konvertiert sie zu base64, dann übergibt sie sie Anfragen an einen API-Server als Parameter einer POST-Anfrage. Mein zugegebenermaßen dilettantisch Code ist wie folgt:GET funktioniert, POST nicht

import csv 
import json 
import requests 
import base64 
import getpass 

f = raw_input("Enter CSV filename: ") 
global clientCode 
clientCode = raw_input("Enter customer code: ") 
username = raw_input("Enter username: ") 
password = getpass.getpass("Enter password: ") 
global url 
url = "https://" + clientCode + ".redacted.com/api" 

def getSessionKey(): 
    querystring = {"request":"verifyUser","username":username,"password":password,"clientCode":clientCode} 
    response = requests.request("GET", url, params=querystring, timeout=10) 
    jr = json.loads(response.text) 
    # print(response.text) 
    global sessionKey 
    sessionKey = jr['records'][0]['sessionKey'] 
    errorCode = jr['status']['errorCode'] 

with open(f, 'rb') as myfile: 
    reader = csv.reader(myfile) 
    rownum = 0 
    getSessionKey() 
    for row in reader: 
     productID = row[0] 
     imageURL = row[1] 
     dlimage = requests.get(imageURL, stream=True, timeout=10) 
     encodedImage = base64.encodestring(dlimage.content) 
     imagequery = {'clientCode':clientCode,'sessionKey':sessionKey,'request':'saveProductPicture','productID':productID,'picture':encodedImage} 
     response = requests.post(url, data=imagequery, timeout=10) 
     print response.status_code 
     ir = json.loads(response.text) 
     errorCode = ir['status']['errorCode'] 
     print errorCode 
     rownum = rownum + 1 

Nun, wenn ich die Antwort Linie response = requests.get(url, params=imagequery, timeout=10) ändern, es funktioniert. Da es sich jedoch um eine GET-Anforderung handelt, löst der Server einen HTTP 414-Fehler für Bilder aus, die größer als etwa 1 KB sind. Wenn ich den Code wie oben ausgeführt habe, gibt der API-Server einen Fehler aus, der darauf hinweist, dass der Parameter clientCode nicht angezeigt wird. Es liegt also nahe, dass er keine der Daten sieht. Was mache ich falsch?

Danke, dass Sie mir beim Lernen geholfen haben.

+0

Welche Codierung verwendet der Server für die Daten? Standardmäßig verwenden Anfragen formcodierte Daten - vielleicht benötigt sie etwas anderes, z. Json stattdessen? –

+0

Ich versuchte Header, die sowohl form-codierte und json, beide geben das gleiche Ergebnis. Das heißt, der Server konnte den Parameter clientCode nicht sehen. –

+0

Haben Sie Dokumente für diese API? Was ist der genaue Fehler, den Sie bekommen? Schwer zu helfen, ein Problem über API-Verwendung zu debuggen, wenn wir keine Ahnung haben, ob Sie die API korrekt verwenden., – pvg

Antwort

0

Ich bin mir immer noch nicht sicher, warum Anfragen sich so verhielten, wie es war, aber ich schrieb den Code um, stattdessen httplib zu verwenden, und es funktioniert.