2016-02-19 21 views
0

Amazon S3有大量的reasons爲什麼它會返回HTTP 400錯誤請求錯誤。最相關的事實是,這些錯誤中有一些來自互聯網的不可靠性,例如請求超時。可能返回的另一個原因是如果存儲桶或密鑰名稱無效。如何區分Amazon S3的不同BadRequest錯誤?

我正嘗試上傳文件到S3,其中包含由客戶控制的密鑰名稱提供的密鑰名稱。我需要能夠區分暫時的400錯誤,如超時和錯誤的密鑰/桶名錯誤,這些錯誤不會是暫時的。瞬間錯誤將表明我們應該重試上傳,而非瞬時錯誤意味着我們應該停止嘗試上傳該文件。

但是,我不知道如何區分這兩個錯誤!如果它很重要,我試圖使用JetS3t API來執行這些上傳。如何區分錯誤的密鑰/桶名稱錯誤和其他含有400錯誤代碼的錯誤?

回答

1

閱讀回覆正文。

從頁面引用您:

身體的問題o [F]的響應還包含有關該錯誤的信息。

解析伴隨http錯誤代碼的響應主體。錯誤的解釋幾乎總是在響應主體中用XML來表達。

例廢話請求(這裏沒有任何編輯,這正是我使用GET請求來產生這個錯誤):

http://example-bucket.s3.amazonaws.com/?AWSAccessKeyId=AKIAEXAMPLEEXAMPLE&Signature=bogus&Expires=1500000000 

響應:

<Error> 
<Code>InvalidAccessKeyId</Code> 
    <Message> 
    The AWS Access Key Id you provided does not exist in our records. 
    </Message> 
<AWSAccessKeyId>AKIAEXAMPLEEXAMPLE</AWSAccessKeyId> 
<RequestId>...</RequestId> 
<HostId>...</HostId> 
</Error> 

你會發現一個漂亮的此內容與可能的錯誤列表之間密切相關。

現在,從技術上講,這是一個403而不是400,這只是我想出的一個簡單的手工無意義請求產生錯誤的第一個想法,但任何S3錯誤都應該產生可比較的響應。

+0

啊,我得看看各種第三方API是否允許我獲取這些信息。一個用於各種測試的python似乎沒有給我提供這些信息。一旦我知道這將與Jets3t API協同工作,我會立即投入/接受。 – BlackVegetable

+0

我找到了一種使用jets3t來做到這一點的方法。但是,我無法訪問該庫中的XML響應。如果您可以找到一種方法來訪問該庫中原始XML響應中的錯誤密鑰名稱(嘗試「.. \\」),我會接受/ upvote這個答案。 – BlackVegetable

+1

雖然也許不完全符合定義,但我認爲這是一種[錯誤隱藏](https://en.m.wikipedia.org/wiki/Error_hiding),一種明確的反模式。它讓我感到困惑,爲什麼這麼多的圖書館似乎不打算提供如此批判性的有用信息,這是我早期編寫我從頭開始使用的許多AWS庫的動機之一,僅使用API​​文檔。確實需要更長時間才能完成任務,但收益是我很少對錯誤感到驚訝。 –