我正在开发一个将一些数据存储在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://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);
答案 0 :(得分:-1)
我通过将数据发布到php脚本,然后使用此脚本将值发布到Amazon来规避问题。这修复了我直接从cookie中读取值时遇到的内容类型问题。
答案 1 :(得分:-2)
使用第三方库不是一个好主意,因为如果他们有错误,那么找到它比在你自己的代码中更难。