2015-07-20 4 views
10

मैं एक amazonS3 निर्धारित यूआरएल के लिए एक पुट अनुरोध भेजने की कोशिश कर रहा हूँ। मेरा अनुरोध दो बार कहा जाता है भले ही मेरे पास केवल एक पुट अनुरोध है। पहला अनुरोध 200 OK देता है, दूसरा दूसरा 400 Bad Request देता है।केवल एक ऑथ तंत्र की अनुमति है; केवल एक्स-अमेज़-एल्गोरिदम क्वेरी पैरामीटर ..?

यहाँ मेरी कोड है:

var req = { 
    method: 'PUT', 
    url: presignedUrl, 
    headers: { 
     'Content-Type': 'text/csv' 
    }, 
    data: <some file in base64 format> 
}; 

$http(req).success(function(result) { 
    console.log('SUCCESS!'); 
}).error(function(error) { 
    console.log('FAILED!', error); 
}); 

और अधिक विस्तार में 400 Bad Request त्रुटि:

<?xml version="1.0" encoding="UTF-8"?> 
<Error> 
    <Code>InvalidArgument</Code> 
    <Message>Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified</Message> 
    <ArgumentName>Authorization</ArgumentName> 
    <ArgumentValue>Bearer someToken</ArgumentValue> 
    <RequestId>someRequestId</RequestId> 
    <HostId>someHostId</HostId> 
</Error> 

क्या मुझे समझ नहीं आता, क्यों यह 400 लौटा रहा है है? और कामकाज क्या है?

+0

मैं जांच करता हूं कि इसे दो बार क्यों कहा जाता है, क्योंकि पहली बार काम करने के लिए ठीक लगता है –

+0

क्या आपको कोई समाधान मिला? – Hemang

+2

यदि आप s3 url को कॉल करना चाहते हैं, तो बस इसे कॉल करने से पहले अपने ऐप में किसी भी अन्य एपीआई के लिए उपयोग किए गए किसी भी प्राधिकरण शीर्षलेख को हटा दें। –

उत्तर

12

आपका क्लाइंट शायद प्रारंभिक अनुरोध भेज रहा है जो प्राधिकरण शीर्षलेख का उपयोग करता है, जिसे 302 के साथ जवाब दिया जा रहा है। प्रतिक्रिया में एक स्थान शीर्षलेख शामिल है जिसमें हस्ताक्षर पैरामीटर है। समस्या यह है कि प्रारंभिक अनुरोध के शीर्षलेखों को बाद के पुनर्निर्देशन अनुरोध में कॉपी किया जा रहा है, जैसे कि इसमें प्राधिकरण और हस्ताक्षर दोनों शामिल हैं। यदि आप बाद के अनुरोध से प्राधिकरण को हटाते हैं तो आपको अच्छा होना चाहिए।

यह मेरे साथ हुआ, लेकिन जावा/एचटीपी क्लाइंट पर्यावरण में। मैं जावा में समाधान का विवरण प्रदान कर सकता हूं, लेकिन दुर्भाग्य से AngularJS के लिए नहीं।

+0

यदि आप जावा में अपने समाधान के विवरण पेस्ट कर सकते हैं तो यह बहुत अच्छा होगा ... बस एक ही समस्या में भाग गया। – velval

+0

दुर्भाग्यवश कोड को S3 तक पहुंचने के वैकल्पिक तरीके से प्रतिस्थापित किया गया था (सीधे ऐप सर्वर के माध्यम से स्ट्रीम किया गया), इसलिए मेरे पास अब और नहीं है। लेकिन मूल रूप से आप प्रतिक्रिया हेडर तक पहुंचते हैं और अपने बाद के अनुरोध पर आवेदन करने से पहले प्राधिकरण को हटा देते हैं। – mlohbihler

+2

यह एक बहुत उपयोगी था। मुझे डाकिया में एक ही समस्या मिल रही है। इसे हल करने का कोई तरीका है – arjuncc

0

मुझे पता है कि यह उत्तर देने में बहुत देर हो सकती है, लेकिन @mlohbihler की तरह, मेरे लिए इस त्रुटि का कारण प्राधिकरण हेडर को http इंटरसेप्टर द्वारा भेजा गया था जिसे मैंने कोणीय में स्थापित किया था। अनिवार्य रूप से, मैंने एडब्ल्यूएस एस 3 डोमेन को सही ढंग से फ़िल्टर नहीं किया था ताकि इसे स्वचालित रूप से जेडब्ल्यूटी प्राधिकरण शीर्षलेख प्राप्त करने से बचें।

0

इसके अलावा, 400 "अमान्य तर्क" आपके एस 3 :: प्रेसीनेर के लिए गलत कॉन्फ़िगरेशन/क्रेडेंशियल के परिणामस्वरूप सतह हो सकता है जो यूआरएल को शुरू करने के लिए निर्धारित कर रहा है। एक बार जब आप 400 से अधिक हो जाते हैं, तो आपको 501 "लागू नहीं किया गया" प्रतिक्रिया मिल सकती है जैसे मैंने किया था। सामग्री-लंबाई शीर्षलेख निर्दिष्ट करके इसे हल करने में सक्षम था (आवश्यक शीर्षलेख के रूप में निर्दिष्ट here)। उम्मीद है कि @arjuncc में मदद करता है, यह एक निर्धारित यूआरएल के साथ s3 छवि अपलोड का परीक्षण करते समय मेरे पोस्टमैन मुद्दे को हल करता है।

संबंधित मुद्दे