我正在使用适用于python的AWS SDK与SimpleDB进行交互。
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
)
这段代码有效,但如果Value
有一个特殊字符,如ñ、á、é、í、ó、ú,那么我会收到一个错误:
botocore.exceptions.ClientError: 发生错误 (SignatureDoesNotMatch( 在调用 BatchPutAttributes 操作时: 我们计算的请求签名与您的签名不匹配 提供。检查您的 AWS 秘密访问密钥和签名方法。咨询 有关详细信息,请参阅服务文档。
SDB 支持将数据存储为 UTF-8,我还尝试将字段AlternateValueEncoding
添加到方法batch_delete_attributes
记录的属性中,但仍然没有运气。
考虑在发送到 SDB 时将数据编码为 base64 并在取回数据时解码,但我不确定这是正确的答案。那么我错过了什么?
蟒蛇:3.6.2 BOTO3: 1.4.5
似乎这是一个报告的问题 https://github.com/boto/boto3/issues/354
问题是发送到sdb
的请求需要标头charset=utf-8
的值Content-Type
建议的解决方案对我有用,只是为了在我的代码中复制此代码片段
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