2017-08-01 3 views
0

J'utilise AWS SDK pour que python interagisse avec SimpleDB.Encodage dans SimpleDB pour batch_put_attributes

client = boto3.client('sdb') 

example = [ 
    {'Name': 'test1', 'Attributes': [ 
     {'Name': 'speaker', 'Value': 'DIEGO BASSANTE'}]}, 
    {'Name': 'test2', 'Attributes': [ 
     {'Name': 'speaker', 'Value': 'SERGIO JOSE'}]}] 

response = client.batch_put_attributes(
    DomainName='activities', 
    Items=example 
) 

Ce code fonctionne, mais si le Value a un caractère spécial comme ñ, á, é, í, ó, ú je reçois une erreur:

botocore.exceptions.ClientError: An error occurred (SignatureDoesNotMatch) when calling the BatchPutAttributes operation: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

suposes SDB pour stocker les données comme UTF-8 et j'ai également essayé d'ajouter le champ AlternateValueEncoding aux attributs comme documenté pour la méthode batch_delete_attributes mais toujours pas de chance.

Pensé sur l'encodage des données à base64 lors de l'envoi à SDB et le décodage lors de la récupération des données, mais je ne suis pas sûr que ce soit la bonne réponse. Alors qu'est-ce qui me manque?

python: 3.6.2 boto3: 1.4.5

Répondre

0

On dirait que c'est un problème signalé https://github.com/boto/boto3/issues/354

Le problème est que la requête envoyée à sdb a besoin de la valeur charset=utf-8 dans l'en-tête Content-Type

La solution proposée a fonctionné pour moi, juste pour copier cet extrait dans mon code

from botocore import endpoint 


def make_request(self, operation_model, request_dict): 
    if self._endpoint_prefix == 'sdb': 
     request_dict['headers']['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' 
    return self._send_request(request_dict, operation_model) 
endpoint.Endpoint.make_request = make_request