Pour mon projet PixUP, relativement aux hébergeurs d’images que sont framapic, et lutim - le premier utilisant sur ses serveurs le second - la réponse à ma requête d’envoi se fait par défaut au format JSON.
$ python --version
Python 2.7.11+
Pour la transmission de la requête, j’utilise donc ‘requests’ - c’est assez bien documenté, et assez facile à utiliser …
Le format JSON est vraiment restitué selon la documentation API officielle de Lutim … c’est l’usage typique du format API de l’ajout d’image qui est utilisé ; le retour étant bel et bien de ce type :
{
“success”: true,
“msg”: {
“real_short”: “abc”,
“short”: “abc/def”,
“token”: “ghijkl”,
“thumb”: XXX,
“filename”: “myimage.png”
}
}
parameter | type | role
success | true/false | upload-status
msg | dict
real_short | string | image identifier
short | string | real_short + encryption key
token | string
thumb | string | base64 encoded thumbnail of the image, if PerlMagick is installed on the server
filename | string | filename of the uploaded image
On réalise selon ce schéma que ‘msg’ est un dict, et que - pour l’exemple - ‘filename’ est une chaîne de caractère, n’est-ce pas ?!
Le code python qui gère la requête d’envoi d’ajout d’image est celui-ci, même si je ne fournis pas l’ensemble … :
if scheme == 'https':
if self.service == 'framapic' or self.service == 'lutim':
request = requests.post(self.actions[self.service]['url'],
files = info, data = datas, verify = False)
else:
request = requests.post(self.actions[self.service]['url'],
files = info, data = datas, verify = True)
elif scheme == 'http':
request = requests.post(self.actions[self.service]['url'],
files = info, data = datas, verify = False)
self.log.debug(request)
del(scheme)
request.encoding = 'utf-8'
ctype = request.headers['Content-Type']
if ctype == 'application/json':
self.response = request.json()
else:
self.response = request.text
Dans le cas de lutim - et assimilé - je passe donc par le traitement json, soit l’usage de request.json() affecté à la variable ‘self.response’ …
Il m’avait semblait comprendre que, puisque c’est un traitement json, je pouvais l’interroger, tel que - , par exemple, pour avoir le contenu de l’index ‘filename’ faisant partie du dictionnaire ‘msg’ :
self.response['msg']['filename']
Or, python me répond :
pprint(self.response['mssg']['filename'])
TypeError: string indices must be integers
J’ai essayé sous ces autres formes :
self.response[u'msg']['filename']
self.response[u'msg'][u'filename']
self.response[u'msg'][0]['filename']
Mais j’ai toujours le même message d’erreur … et, je ne comprends pas pourquoi il me dit que ce doit être un entier alors que clairement on a affaire à un index|key associatif …
Une idée ?