Une AttributeError en Python indiquant "'bytes' object has no attribute 'encode'" lors de l'appel de ZRC.post() signifie que le SDK a tenté d'appeler .encode('utf-8') sur un corps qui était déjà en bytes. Le code du connecteur suppose que le corps est une chaîne de caractères et le double encodage des bytes provoque le crash[1].
Ce que cela signifie
ZRC.post() dans le connecteur Python Zoho CRM prépare le corps de la requête en appelant data.encode('utf-8') avant l'envoi. Si vous fournissez un corps qui est déjà un objet bytes (par exemple, une charge utile FormData/bytes ou quelque chose d'encodé précédemment), le code lève une AttributeError car les objets bytes n'ont pas de méthode encode. Il s'agit d'une inadéquation côté client entre l'attente du SDK et le type que vous avez fourni[1][2].
Causes courantes
- Fournir un objet
bytes(binaire) àZRC.post()au lieu d'une chaînestrPython[1]. - Construire une charge utile
multipart/FormDataou utiliser une aide qui renvoie desbytes, puis la fournir directement àZRC.post()[1]. - Double encodage : vous appelez
urlencodeou encodez autrement enbytes, puis le SDK tente d'encoder à nouveau[1]. - Utilisation d'une version du SDK qui appelle toujours
data.encode(...)sans vérification pour lesbytes(bug du connecteur)[1].
Comment le corriger
- Préférez envoyer une chaîne de caractères. Si vous avez des
bytes, décodez d'abord en texte :
- body = body_bytes.decode('utf-8')
- appelez ZRC.post(endpoint, body, config)
- Pour les POST encodés en formulaire, utilisez
urllib.parse.urlencode(...)qui renvoie unestr, puis définissez l'en-têteContent-Type:
- from urllib.parse import urlencode
- payload = urlencode(params)
- config['headers'] = {'Content-Type': 'application/x-www-form-urlencoded'}
- ZRC.post(endpoint, payload, config)
- Si vous devez envoyer des données binaires
multipart/form-data(fichiers), appelez directement le client HTTP au lieu deZRC.post(), ou adaptez le connecteur pour prendre en charge lesbytes. Utilisezrequestsavec la même authentification/le même jeton récupéré de votre connexion Zoho. - Correctif à court terme (solution locale) dans
zcconnector/_init_.py: modifiez la ligne qui encode les données pour n'encoder que lorsque les données sont unestr. Exemple de remplacement :
- if isinstance(data, bytes): body = data
- elif data is not None: body = data.encode('utf-8')
- else: body = None
Appliquez ce correctif uniquement dans les environnements que vous contrôlez ; incluez la trace de la pile d'origine et les lignes de code lors du signalement.
- Si vous pensez que le connecteur devrait accepter les
bytespar défaut, déposez un rapport de bug dans la communauté Zoho avec une reproduction minimale (point de terminaison, type de charge utile, trace de la pile) afin que le SDK puisse être corrigé en amont[1].
Quand escalader
Ouvrez un ticket de support ou déposez un bug si vous ne pouvez pas modifier le type de corps (par exemple, une bibliothèque tierce renvoie toujours des bytes), ou si vous avez besoin de la prise en charge du téléchargement de fichiers multipart dans ZRC.post(). Incluez la trace de la pile exacte, la version du SDK et un court extrait reproductible afin que l'ingénierie puisse corriger le connecteur[1].
[1]: Erreur d'encodage du corps ZRC.post() : fonction Python CRM (fil de discussion de la communauté Zoho).
[2]: Liste de la communauté Zoho sur le même sujet.