Использование не ASCII-символов при обновлении значений в AWS SimpleDB возвращает ошибку SignatureDoesNotMatch

Я занимаюсь разработкой приложения, которое хранит некоторые данные в экземпляре Amazon SimpleDB. При выполнении обновления значений в этой базе данных я получаю сообщение об ошибке от API:

Array ([curl] => [Errors] => Array ([0] => Array ([Code] => SignatureDoesNotMatch [Message] => Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте секретный доступ AWS) Ключ и метод подписи. За подробностями обращайтесь к сервисной документации. [BoxUsage] =>)))

Я обнаружил, что это происходит, если я пытаюсь обновить базу данных некоторыми не ASCII-символами, такими как "ØÆÅ". Я дважды проверил, что с метками времени, используемыми для генерации подписи, что-то не так (как предлагают некоторые вопросы по теме переполнения стека).

Кто-нибудь может подтвердить, что SimpleDB не поддерживает эти символы? У кого-нибудь есть обходной путь для этого?

Я использую стороннюю библиотеку для доступа к базе данных. Его можно найти здесь: http://sourceforge.net/projects/php-sdb/

Редактировать:

Дальнейшее изучение сторонней библиотеки показывает, что все параметры кодируются с использованием 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);

2 ответа

Решение

Я обошел проблему, разместив данные в php-скрипте, а затем используя этот скрипт для публикации значений в Amazon. Это исправило проблемы с типом контента, которые возникали у меня при чтении значений непосредственно из файла cookie.

Использование сторонних библиотек не является хорошей идеей, потому что, если у них есть ошибка, найти ее сложнее, чем в вашем собственном коде.

Другие вопросы по тегам