2017-08-01 7 views
0

Ich verwende das AWS SDK für Python mit SimpleDB interagieren.Codierung in SimpleDB für 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 
) 

Dieser Code funktioniert, aber wenn der Value hat einen besonderen Charakter wie ñ, á, é, í, ó, ú dann habe ich einen Fehler:

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.

SDB suposes zu speichern die Daten als UTF-8 und ich habe auch versucht, das Feld AlternateValueEncoding zu den Attributen wie für die Methode batch_delete_attributes dokumentiert, aber immer noch kein Glück.

Ich dachte über die Codierung der Daten nach Base64 beim Senden an SDB und Decodierung beim Abrufen der Daten zurück, aber ich bin mir nicht sicher, dass das die richtige Antwort ist. Also was fehlt mir?

Python: 3.6.2 boto3: 1.4.5

Antwort

0

Scheint, wie es ein gemeldetes Problem ist https://github.com/boto/boto3/issues/354

Das Problem ist, dass die Anforderung an sdb geschickt, um den Wert benötigt charset=utf-8 im Header Content-Type

Die vorgeschlagene Lösung funktionierte für mich, nur um dieses Schnipsel in meinem 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 
01 zu kopieren