Bonjour,

J'utilise les fonctions suivantes pour communiquer avec une API :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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