2012-02-29 44 views
2

我正在開發一個將一些數據存儲在Amazon SimpleDB實例中的應用程序。在更新此數據庫中的值時,出現API錯誤:更新AWS SimpleDB中的值時使用非ASCII字符返回SignatureDoesNotMatch錯誤

Array([curl] => [Errors] => Array([0] => Array([Code] => SignatureDoesNotMatch [Message] =>我們計算的請求籤名與您提供的簽名不匹配請檢查您的AWS祕密訪問密鑰和簽名方法請參考服務文檔瞭解詳情[BoxUsage] =>)))

我發現這個如果我嘗試使用一些非ASCII字符(如「ØÆÅ」)更新數據庫,會發生這種情況。我仔細檢查過,用於生成簽名的時間戳沒有問題(就像Stack Overflow中的一些關於主題的問題所建議的那樣)。

任何人都可以確認SimpleDB不支持這些字符嗎?有沒有人有這方面的解決方法?

我正在使用第三方庫訪問數據庫。它可以在這裏找到:http://sourceforge.net/projects/php-sdb/

編輯:

的第三方庫的進一步研究表明,所有參數均使用rawurlencode()編碼。據我所見,它也遵循亞馬遜的要求,可以在這篇文章中找到:http://aws.amazon.com/articles/1928

因此,我在什麼嘗試接下來在這裏損失。

編輯2:

我想我可能會在這裏關閉的問題。我有一個使用相同的PHP API來存儲值的iPhone應用程序。發佈這些非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); 
+0

添加了一些關於我認爲是問題的信息。我認爲需要在請求上設置Content-Type以使其工作。通過相同的API發佈iPhone中的非ASCII字符可以正常工作,但是從PHP腳本中完成並非如此。 – 2012-03-02 09:34:13

+0

它可能是一個編碼問題?你提到ASCII,但亞馬遜需要規範化的UTF-8。請參閱http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/HMACAuth。html – Martin 2012-03-09 02:58:48

+0

是的一切都指向它是一個編碼問題。我已經能夠通過確保將這些值發佈到腳本之後再將其發佈到亞馬遜上來避開這個問題。這似乎以某種方式應用了正確的內容類型元數據,並且Amazon接受了這些字符。這不是最好的解決方案,但考慮到該項目的時間框架,它會這樣做。 – 2012-03-13 08:51:22

回答

-1

我通過將數據發佈到php腳本來規避問題,然後使用此腳本將值發佈到Amazon。這固定了我在直接從cookie中讀取值時遇到的內容類型問題。

-2

使用第三方庫是不是一個好主意,因爲如果他們有一個bug,那麼它很難找到它,而不是你自己的代碼。

+2

我假設你從零開始構建一切,包括你自己的操作系統,編譯器等等?重新創建輪子很少是一個好主意。哦,這真的不回答這個問題... – 2012-03-12 07:18:03

+0

是的,我同意。我傾向於儘可能經常使用第三方庫。只要他們是好的。 – 2012-03-13 08:48:17