在AWS SimpleDB中更新值时使用非ASCII字符会返回SignatureDoesNotMatch错误

时间:2012-02-29 12:24:35

标签: php amazon-web-services http-headers amazon-simpledb

我正在开发一个将一些数据存储在Amazon SimpleDB实例中的应用程序。在更新此数据库中的值时,我从API中收到错误:

数组([curl] => [错误] =>数组([0] =>数组([代码] => SignatureDoesNotMatch [消息] =>我们计算的请求签名与签名不匹配您提供了。检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。[BoxUsage] =>)))

我发现如果我尝试使用某些非ASCII字符(如“ØÆÅ”)更新数据库,就会发生这种情况。我已经仔细检查过用于生成签名的时间戳没有问题(就像Stack Overflow中有关于该主题的一些问题所示)。

有人可以确认SimpleDB不支持这些字符吗?有没有人为此得到解决方法?

我正在使用第三方库来访问数据库。可在此处找到:http://sourceforge.net/projects/php-sdb/

编辑:

对第三方库的进一步调查显示,所有参数均使用rawurlencode()进行编码。据我所知,它也遵循亚马逊的要求,可以在本文中找到:http://aws.amazon.com/articles/1928

所以我不知道接下来要尝试什么。

编辑2:

我想我可能会在这里讨论这个问题。我有一个iPhone应用程序,它使用相同的PHP API来存储值。发布这些非ASCII字符时,应用程序正常工作。在应用程序中,我们将“Content-Type”设置为“application / x-www-form-urlencoded”。

我发现了一些描述相同内容的文章:

http://chris.finne.us/2010/04/12/amazon-simpledb-signaturedoesnotmatch-error-when-putting-utf-8-characters-via-a-http-post/

http://groups.google.com/group/simple-record/browse_thread/thread/aa3cd430b35e8e1c?pli=1

我已尝试在我的代码中指定content-type,但尚未成功。该实现使用PHP函数curl来执行请求。 我添加了此代码来设置标题,但似乎没有任何区别:

($headers variable declared at the top of the class)
$this->headers[] = 'Content-Type: application/x-www-form-urlencoded;charset=utf-8';
curl_setopt($curl, CURLOPT_HTTPHEADER, $this->headers);

2 个答案:

答案 0 :(得分:-1)

我通过将数据发布到php脚本,然后使用此脚本将值发布到Amazon来规避问题。这修复了我直接从cookie中读取值时遇到的内容类型问题。

答案 1 :(得分:-2)

使用第三方库不是一个好主意,因为如果他们有错误,那么找到它比在你自己的代码中更难。