2015-12-28 4 views
12

मैंने XML API का उपयोग करके Google क्लाउड स्टोरेज में एक फ़ाइल अपलोड करने का प्रयास किया। मेरे पास प्रत्येक अपलोड के लिए GoogleAccessId, समाप्ति तिथि और हस्ताक्षर उत्पन्न सही है। अजीब बात यह है कि मैं पोस्टमैन (क्रोम के लिए आवेदन) का उपयोग कर फ़ाइल डाल सकता हूं, इसलिए मुझे यकीन है कि यूआरएल ठीक है। मैं बस अपने एंड्रॉइड जावा प्रोग्राम का उपयोग नहीं कर सकता (यह मुझे 403 त्रुटि देता है)।Google क्लाउड स्टोरेज को HttpURLConnection PUT त्रुटि दे रहा है 403

URL url; 
    HttpURLConnection connection; 

    try { 
     url = new URL("http://google-testbucket.storage.googleapis.com/[email protected]unt.com&Expires=1331155464&Signature=BClz9e4UA2MRRDX62TPd8sNpUCxVsqUDG3YGPWvPcwN%2BmWBPqwgUYcOSszCPlgWREeF7oPGowkeKk7J4WApzkzxERdOQmAdrvshKSzUHg8Jqp1lw9tbiJfE2ExdOOIoJVmGLoDeAGnfzCd4fTsWcLbal9sFpqXsQI8IQi1493mw%3D"); 
     connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoOutput(true); 
     connection.setRequestMethod("PUT"); 

     OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); 
     out.write("Test"); 
     out.close(); 

     Log.i("TAG", "PUT Response code: " + connection.getResponseCode()); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     Log.e("TAG", "MalformedURLException"); 
    } catch (ProtocolException e) { 
     e.printStackTrace(); 
     Log.e("TAG", "ProtocolException"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.e("TAG", "IOException"); 
    } 

PUT वस्तु के लिए प्रलेखन:: स्रोत कोड प्रदर्शन अपलोड यहाँ (: https://cloud.google.com/storage/docs/access-control#Signing-Strings यह इस पर आधार) है https://cloud.google.com/storage/docs/xml-api/put-object-upload

किसी को भी इस समस्या पर गौर और दे सकते हैं मुझे संकेत क्या इस के साथ गलत हो गया हो सकता है एक?

+0

http://stackoverflow.com/questions/17225638/forbiddenerror-when-attempting-to-write-file-to-gcs-from-gae-python-app की संभावित डुप्लिकेट अधिकतर संभावना है कि आपका एंड्रॉइड ऐप ठीक से प्रमाणीकृत नहीं है और क्रोम में आप हैं (मुझे लगता है कि आप क्रोम में अपने Google खाते पर लॉग इन हैं) – morpheus05

+0

मुझे नहीं लगता कि यह एक बिंदु है, क्योंकि पोस्टमैन के लिए यह भी काम करता है जब मैं अपने किसी भी खाते से साइन आउट करता हूं। अलग-अलग मूल कारण होना चाहिए, लेकिन मैं विचारों से बाहर हूं। – SmiglowiecX

+0

यदि आप हस्ताक्षरित यूआरएल के साथ काम करते हैं तो यूआरएल गलत हो सकता है, – morpheus05

उत्तर

11

मुझे लगा कि HttpURLConnectionContent-Type हेडर application/x-www-form-urlencoded मूल्य के साथ शीर्षलेख जोड़ता है। मैंने इसे अपने एंड्रॉइड एमुलेटर पर HTTP स्निफर का उपयोग करके किया है।

इस ऑटो-हेडर हेडर ने हस्ताक्षर विसंगति का कारण बना दिया। Content-Type: application/x-www-form-urlencoded के साथ अनुरोधों को अनुमति देने के लिए सर्वर-साइड पर कोड बदलने के बाद यह सही हस्ताक्षर उत्पन्न करता है और यह ठीक काम करता है।

आपकी प्रतिबद्धता के लिए @ morpheus05 धन्यवाद।

0

कृपया अपनी सामग्री प्रकार इस तरह सेट करें।

connection.setRequestProperty ("सामग्री-प्रकार", "");

क्योंकि HttpsURLConnection अपने आप ही "सामग्री प्रकार: आवेदन/x-www फार्म-urlencoded" सामग्री प्रकार उत्पन्न इस हस्ताक्षर बेमेल का कारण होगा।

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