2012-05-30 22 views
22

में DropBox REST API का उपयोग कर फ़ाइलों की प्रतिलिपि कैसे करें I ड्रॉपबॉक्स एपीआई का उपयोग कर ऑपरेटिंग फ़ाइल कॉपी को प्रबंधित नहीं कर रहा है। मैं अपने क्लाइंट को सफलतापूर्वक अधिकृत कर सकता हूं, फ़ाइलों को डाउनलोड और अपलोड कर सकता हूं। कॉपी ऑपरेशन को उपयोग करने के लिए POST विधि की आवश्यकता होती है और मुझे लगता है कि यह वह जगह है जहां मैं गलत अनुरोध करता हूं। मैं OAuth प्रमाणीकरण के लिए POST विधि को परिभाषित कर रहा हूं और अनुरोध पोस्ट करने के लिए इंडी TIdHTTP का उपयोग कर रहा हूं, लेकिन मुझे हमेशा त्रुटि कोड 403 प्राप्त होता है - अनुमति अस्वीकार कर दी गई है। https://www.dropbox.com/developers/reference/api#fileops-copyडेल्फी

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

यहाँ ड्रॉपबॉक्स एपीआई वर्णन है के रूप में मैं जानता हूँ कि जब Indy के साथ प्रयोग पैरामीटर संदेश के मुख्य भाग में कॉपी कर रहे हैं जहाँ तक

ParamStr := Format('root=%s&from_path=%s&to_path=%s', [Root, EncodeFileName(FromPath), EncodeFileName(ToPath)]); 
URL := 'https://api.dropbox.com/1/fileops/copy' + '?' + ParamStr; 

Consumer := TOAuthConsumer.Create(Key, Secret); 
AToken := TOAuthToken.Create(fToken, fTokenSecret); 
HMAC := TOAuthSignatureMethod_HMAC_SHA1.Create; 
ARequest := TOAuthRequest.Create(''); 
try 
    ARequest.HTTPURL := URL; 
    ARequest.Method := 'POST'; 
    ARequest := ARequest.FromConsumerAndToken(Consumer, AToken, ''); 
    ARequest.Sign_Request(HMAC, Consumer, AToken); 


    Params := TStringList.Create; 
    try 
    Params.Text := ParamStr + '&' + ARequest.GetString; 
    HTTP.Post(URL, Params); 
    finally 
    Params.Free; 
    end; 
+0

एसएसएल के साथ इंडी का उपयोग करने के तरीके को देखने का प्रयास करें। मुझे यकीन है कि आप ओपनएसएसएल पुस्तकालयों को याद कर रहे हैं। – TLama

+0

आपको क्या लगता है कि त्रुटि का अर्थ दस्तावेज अर्थ के अलावा कुछ भी है? "403: एक अमान्य प्रतिलिपि ऑपरेशन का प्रयास किया गया था (उदाहरण के लिए दिए गए गंतव्य पर पहले से ही एक फ़ाइल है, या एक साझा फ़ोल्डर को साझा फ़ोल्डर में कॉपी करना)।" –

+1

@Tlama, एसएसएल पुस्तकालयों को भी अधिकृत नहीं किया जाएगा, अपलोड, अपलोड और संचालन डाउनलोड करने में हस्तक्षेप, जो माना जाता है कि काम कर रहे हैं? –

उत्तर

1

और

http:Post(URL+encodeparams(params)); 

मुझे यकीन है कि यह सही वाक्य रचना है, लेकिन है कि विचार है नहीं कर रहा हूँ: नहीं यूआरएल में की तरह कुछ का उपयोग करें।

1

मुझे लगता है कि मुझे पता चल सकता है कि यहां क्या गलत है। मुझे TOAuthRequest क्लास से अनजान है, लेकिन मुझे लगता है कि GetString विधि स्टैंडआउट OAuth हेडर 'प्राधिकरण Bearer {KEY}' देता है। कि शीर्ष लेख और सही तरीके से http अनुरोध को जोड़ने के लिए है देखें

HTTP.Request.CustomHeaders.AddValue('Authorization', <the rest of the string here>) 
दूसरी ओर

आप शरीर जो प्राप्त अनुरोधों के लिए काम कर सकते हैं करने के लिए है कि स्ट्रिंग जोड़ें, क्योंकि शरीर (प्राधिकरण स्ट्रिंग) गलत है शीर्षलेख के लिए लेकिन POST विधि के साथ आपके पास प्राधिकरण स्ट्रिंग से पहले वास्तविक निकाय है और इस प्रकार OAuth स्ट्रिंग को अनदेखा किया जाता है।

और आखिर में मुझे नहीं लगता कि आपको शरीर में पैरामीटर स्ट्रिंग की भी आवश्यकता है। एक खाली शरीर को ठीक काम करना चाहिए। क्वेरी स्ट्रिंग ठीक लगता है।

उदाहरण कोड:

ParamStr := Format('root=%s&from_path=%s&to_path=%s', [Root, EncodeFileName(FromPath), EncodeFileName(ToPath)]); 
URL := 'https://api.dropbox.com/1/fileops/copy' + '?' + ParamStr; 

Consumer := TOAuthConsumer.Create(Key, Secret); 
AToken := TOAuthToken.Create(fToken, fTokenSecret); 
HMAC := TOAuthSignatureMethod_HMAC_SHA1.Create; 
ARequest := TOAuthRequest.Create(''); 
try 
    ARequest.HTTPURL := URL; 
    ARequest.Method := 'POST'; 
    ARequest := ARequest.FromConsumerAndToken(Consumer, AToken, ''); 
    ARequest.Sign_Request(HMAC, Consumer, AToken); 



    HTTP.Request.CustomHeaders.AddValue('Authorization', <parsed ARequest.GetString>) 
    HTTP.Post(URL); 

उम्मीद है कि इस मदद करता है।