Я разрабатываю приложение, которое хранит некоторые данные в экземпляре Amazon SimpleDB. При обновлении значений в этой базе данных я получаю сообщение об ошибке от API:
Array ([curl] => [Errors] => Array ([0] => Array ([Code] => SignatureDoesNotMatch [Message] => Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте Ключ секретного доступа AWS и метод подписи. Подробную информацию см. В документации по обслуживанию. [BoxUsage] =>)))
Я обнаружил, что это происходит, если я пытаюсь обновить базу данных некоторыми не ASCII-символами, такими как «ØÆÅ». Я дважды проверил, что с временными метками, используемыми для генерации подписи, что-то не так (как предлагают некоторые вопросы по теме в Переполнении стека).
Может ли кто-нибудь подтвердить, что SimpleDB не поддерживает эти символы? У кого-нибудь есть обходной путь для этого?
Я использую стороннюю библиотеку для доступа к базе данных. Его можно найти здесь: http://sourceforge.net/projects/php-sdb/
Edit:
Дальнейшее изучение сторонней библиотеки показывает, что все параметры кодируются с использованием rawurlencode()
. Насколько я вижу, он также соответствует требованиям Amazon, которые можно найти в этой статье: 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);