Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 签署SimpleDB请求_Python_Amazon Simpledb - Fatal编程技术网

Python 签署SimpleDB请求

Python 签署SimpleDB请求,python,amazon-simpledb,Python,Amazon Simpledb,我试图用Python对Amazon的SimpleDB服务进行API调用。例如,我使用的是最简单的请求,ListDomains。然而,无论我尝试什么,响应总是“我们计算的请求签名与您提供的签名不匹配。” 这是我正在签名的字符串(根据): 我用HmacSHA256和HmacSHA1都试过了。似乎什么都不管用。我做错了什么?我不会重新发明轮子-有几个python simpledb库,如 如果没有其他问题的话,他们的签名代码应该会澄清您的错误,但是认真地说,使用现有的维护API,这将使您的生活更

我试图用Python对Amazon的SimpleDB服务进行API调用。例如,我使用的是最简单的请求,
ListDomains
。然而,无论我尝试什么,响应总是“我们计算的请求签名与您提供的签名不匹配。”

这是我正在签名的字符串(根据):


我用HmacSHA256和HmacSHA1都试过了。似乎什么都不管用。我做错了什么?

我不会重新发明轮子-有几个python simpledb库,如


如果没有其他问题的话,他们的签名代码应该会澄清您的错误,但是认真地说,使用现有的维护API,这将使您的生活更加轻松。

一个关键问题是您必须正确地对所有HTTP参数值进行URL编码

以下文档已从SimpleDB文档中消失,但可以在SQS文档中找到,并且仍然与SimpleDB非常相关:

不要对任何 RFC 3986中包含的未保留字符 定义

这些未保留的字符是A-Z, a-z,0-9,连字符(-),下划线(_ )、句号(.)和波浪号(~)

百分比编码所有其他字符 对于%XY,其中X和Y为十六进制 字符0-9和大写字母A-F

百分比编码扩展UTF-8 格式为%XY%ZA的字符

百分比将空格字符编码为 %20(和非+,作为通用编码 计划(确实如此)

您会注意到,在Roger链接的
python simpledb
模块中,它们在形成请求时遵循以下规则:

def escape(s):
  return urllib.quote(s, safe='-_~')

def urlencode(d):
  if isinstance(d, dict):
    d = d.iteritems()
  return '&'.join(['%s=%s' % (escape(k), escape(v)) for k, v in d])

实际上,我正在为另一种语言编写一个SimpleDB模块,并使用Python作为起点来找出我的错误所在。但是谢谢你的提示。很酷-从来没有听说过这个,令人惊讶的是有多少种语言,而实际上你可以用Perl做任何事情;-)实际上,不开玩笑,您可能会发现Perl SimpleDB库也很有用——可能有比Python变体更成熟的解决方案。请确保您正确地对所有HTTP参数值进行URL编码。
import base64,hashlib,hmac,time                                            
# Sign the request                                                                           
signature = hmac.new(                                                                        
    key=AWS_SECRET_ACCESS_KEY,                                                               
    msg=string_to_sign,                                                                      
    digestmod=hashlib.sha1).digest()                                                         
# Base64 encode the signature                                                                
signature = base64.encodestring( signature )
def escape(s):
  return urllib.quote(s, safe='-_~')

def urlencode(d):
  if isinstance(d, dict):
    d = d.iteritems()
  return '&'.join(['%s=%s' % (escape(k), escape(v)) for k, v in d])