【发布时间】:2012-02-29 12:24:34
【问题描述】:
我正在开发一个将一些数据存储在 Amazon SimpleDB 实例中的应用程序。在此数据库中更新值时,我从 API 收到错误:
Array ( [curl] => [Errors] => Array ( [0] => Array ( [Code] => SignatureDoesNotMatch [Message] => 我们计算的请求签名与您提供的签名不匹配。请检查您的AWS Secret Access Key 和签名方法。详情请查阅服务文档。[BoxUsage] => ) ) )
我发现如果我尝试使用一些非 ASCII 字符(如“ØÆÅ”)更新数据库,就会发生这种情况。我已经仔细检查了用于生成签名的时间戳是否有问题(就像 Stack Overflow 上有关该主题的一些问题所暗示的那样)。
谁能确认 SimpleDB 不支持这些字符?有人对此有解决方法吗?
我正在使用第 3 方库来访问数据库。可以在这里找到:http://sourceforge.net/projects/php-sdb/
编辑:
对第 3 方库的进一步调查表明,所有参数都使用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);
【问题讨论】:
-
添加了一些我认为是问题的信息。我认为需要在请求上设置 Content-Type 才能使其工作。通过相同的 API 从 iphone 发布非 ASCII 字符可以正常工作,而从 php 脚本中则不行。
-
会不会是编码问题?您提到了 ASCII,但亚马逊想要规范化的 UTF-8。见docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/…
-
是的,一切都表明这是一个编码问题。通过始终确保将值发布到脚本,然后再将它们再次发布到亚马逊,我已经能够规避这个问题。这似乎以某种方式应用了正确的内容类型元数据,并且亚马逊接受了这些字符。这不是最好的解决方案,但考虑到我的项目时间框架,它会做。
-
由于 UTF-8 是 US-ASCII 的严格超集,ASCII === UTF-8。但是,如果数据设法被编码为 Latin1 (ISO-8859-1) 或 Windows-1252,您几乎肯定会遇到问题。
标签: php amazon-web-services http-headers amazon-simpledb