Bonjour,
J'utilise les fonctions suivantes pour communiquer avec une API :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| import json
import time
import hmac
import hashlib
import base64
import requests
from requests.compat import quote_plus
def api_query(feature_requested, post_parameters=None):
#time.sleep(0.8)
url = "https://www.siteweb.com/Api/" + feature_requested
post_data = json.dumps(post_parameters)
headers = secure_headers(url=url, post_data=post_data)
req = requests.post(url, data=post_data, headers=headers)
if req.status_code != 200:
try:
req.raise_for_status()
except requests.exceptions.RequestException as ex:
return None, "Status Code : " + str(ex)
req = req.json()
if 'Success' in req and req['Success'] is True:
result = req['Data']
error = None
else:
result = None
error = req['Error'] if 'Error' in req else 'Unknown Error'
return (result, error)
def secure_headers(url, post_data):
nonce = str(int(time.time()))
md5 = hashlib.md5()
jsonparams = post_data.encode('utf-8')
md5.update(jsonparams)
rcb64 = base64.b64encode(md5.digest()).decode('utf-8')
signature = key + "POST" + quote_plus(url).lower() + nonce + rcb64
hmacsignature = base64.b64encode(hmac.new(base64.b64decode(secret),
signature.encode('utf-8'),
hashlib.sha256).digest())
header_value = "amx " + key + ":" + hmacsignature.decode('utf-8') + ":" + nonce
return {'Authorization': header_value, 'Content-Type': 'application/json; charset=utf-8'} |
Le code n'est pas de mon fait (je suis seulement en train d'apprendre Python), je me suis contenté de modifier un code trouvé sur le net.
Il fonctionne correctement, sauf quand j’enchaîne les appels de la fonction api_query où je me retrouve au bout d'un certain nombre d'appel avec l'erreur suivante :
json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig)
Pour éviter ce problème, je dois ajouter la ligne time.sleep() au début de la fonction.
En faisant quelques tests avec un while True, j'ai remarqué que le problème apparaît quand je mets le programme en pause moins de 0.8s
1 2 3 4 5
| while True :
result, error = api_query(feature_requested = 'feature',
post_parameters = {'param1': 'data1'})
print("result = {}".format(result))
print("error = {}".format(error), end="\n\n\n\n") |
Je me pose les questions suivantes :
- Pourquoi ? Je me doute que quelque part, quelque chose n'a pas le temps de se réinitialiser, mais où, quoi, qu'est-ce ?
- Comment régler ce problème sans utiliser de time.sleep() ? J'ai besoin d'être réactif et ce délai m'embête beaucoup.
Merci d'avance pour vos réponses
Partager