2017-07-14 5 views
3

J'essaie de faire un http put en utilisant urllib2.Python échec à PUT en utilisant urllib2

L'administrateur du serveur dit que je dois fournir les données dans le format suivant: { "type": "magasin", "data": [ "9953"]}

Mon code est le suivant:

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 

Ma sortie quand je lance c'est:

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

ce qui est exactement ce qu'on m'a dit d'envoyer

Mais je reçois l'erreur suivante:

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]) 

Toute aide serait appréciée.

+1

Pourquoi vous échapper des guillemets doubles (") à l'intérieur des guillemets simples (') (L2? – Mark

+0

L'administrateur de l'application m'a dit de «m'assurer que vous échappiez correctement à vos guillemets doubles». Le retrait des échappements donne les mêmes résultats. – user1864311

Répondre

2

Avis ces 2 lignes de code:

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

result = urllib2.urlopen(request, data) 

Dans la première ligne, vous initialisez la demande en passant le paramètre nommé data mis à la charge utile JSON. Cela semble être correct.

Toutefois, la deuxième ligne passe en data, écrasant la charge utile que vous avez initialisée dans la première ligne. Je suppose que data est ici une variable dans le contexte plus large de votre programme (non montré dans la question d'origine), et que cette variable data est définie à une valeur différente, peut-être une charge JSON invalide.

Si la charge utile dans la première ligne est initialisé correctement, alors je suggère de changer la deuxième ligne à ceci:

result = urllib2.urlopen(request)