2015-01-27 8 views
5

थोड़ी देर के लिए खोज करने के बाद, मुझे एक एपीआई कॉल के लिए निम्नलिखित समाधान मिलते हैं जिन्हें हटाएं विधि की आवश्यकता होती है।पायथन हटाएं एक बाकी एपीआई (जीएई पर)

पहला प्रयास: (httplib पुस्तकालय)

url = '/v1/users/'+ spotify_user_id +'/playlists/'+ playlist_id +'/tracks' 
    data = json.dumps({"tracks": [{ "uri" : track_uri }]}) 
    headers = { 
     'Authorization' : 'Bearer ' + access_token, 
     'Content-Type' : 'application/json' 
     } 

    conn = httplib.HTTPSConnection('api.spotify.com') 
    conn.request('DELETE', url , data, headers) 
    resp = conn.getresponse() 
    content = resp.read() 
    return json.loads(content) 

यह रिटर्न:

{u'error ': {u'status': 400, u'message ': u'Empty JSON शरीर '}}

दूसरा कोशिश:। (urllib2 पुस्तकालय)

url = 'https://api.spotify.com/v1/users/'+ spotify_user_id +'/playlists/'+ playlist_id +'/tracks' 
    data = json.dumps({"tracks": [{ "uri" : track_uri }]}) 
    headers = { 
     'Authorization' : 'Bearer ' + access_token, 
     'Content-Type' : 'application/json' 
     } 

    opener = urllib2.build_opener(urllib2.HTTPHandler) 
    req = urllib2.Request(url, data, headers) 
    req.get_method = lambda: 'DELETE' 

    try: 
     response = opener.open(req).read() 
     return response 
    except urllib2.HTTPError as e: 
     return e 

यह रिटर्न:

HTTP 400 ग़लत अनुरोध

मैं अन्य कार्यों जहां JSON काम कर रहा है है, इसलिए मुझे लगता है कि समस्या हटाएँ विधि के साथ है, लेकिन मैं यह काम नहीं कर प्राप्त कर सकते हैं।

इसके अलावा, वेबपैप Google ऐप इंजन पर चल रहा है, इसलिए मैं पैकेट इंस्टॉल नहीं कर सकता, इसलिए मैं पूर्व-स्थापित लाइब्रेरी में रहना चाहता हूं।
किसी के पास GAE पर एक डिलीट अनुरोध करने का एक अच्छा तरीका है? (मुझे डेटा और हेडर दोनों भेजने की ज़रूरत है)

एपीआई स्पॉटिफ़ाई है: developer.spotify.com/web-api/ और मैं प्लेलिस्ट से ट्रैक हटाने की कोशिश कर रहा हूं।

+1

आपके प्रश्न पूछने के प्रयास में बहुत कुछ करने के लिए धन्यवाद। आपने कम से कम एक दिन के लिए एसओ में अपना विश्वास नवीनीकृत कर लिया है। –

+0

आपका दूसरा उदाहरण अजीब दिखता है क्या आपने केवल urlfetch को आजमाया है - यह DELETE विधि का समर्थन करता है। https://cloud.google.com/appengine/docs/python/urlfetch/fetchfunction –

+0

मैंने urlfetch पर उपयोग करने का प्रयास किया है और मुझे यह प्रतिक्रिया मिलती है: {u'error ': {u'status': 400, u 'संदेश': यू 'लक्षण जेएसओएन बॉडी।}} – NBajanca

उत्तर

3

बहुत सारे शोध के बाद, मुझे पता चला कि यह असंभव है।

, के बारे में DELETE विधि (उनका कहना है कि RFC 2616 अप्रचलित है के लिए @lukasa करने के लिए धन्यवाद) पर RFC 7231 कहा गया है:

हटाएँ विधि अनुरोध करता है कि मूल सर्वर लक्ष्य संसाधन के बीच संघ को हटा दें और इसकी वर्तमान कार्यक्षमता। असल में, यह विधि यूनिक्स में आरएम कमांड के समान है: यह मूल सर्वर के यूआरआई मैपिंग पर एक हटाए गए ऑपरेशन को व्यक्त करता है, जो पहले संबंधित जानकारी हटा दी गई थी।

उस ने कहा, ट्रैक को हटाने से शरीर में पारित होने वाली track_uri की आवश्यकता नहीं होनी चाहिए, लेकिन यह यूआरआई में होना चाहिए।

इसके अलावा, आरएफसी में:

एक हटाने का अनुरोध संदेश के भीतर एक पेलोड कोई परिभाषित अर्थ विज्ञान है; एक DELETE अनुरोध पर एक पेलोड बॉडी भेजकर अनुरोध को अस्वीकार करने के लिए कुछ मौजूदा कार्यान्वयन हो सकता है।

Google ऐप इंजन इस मामले में से एक है, एक डेली अनुरोध को शरीर रखने की अनुमति नहीं देता है।

कहा कि Spotify से प्रतिक्रिया सभी समझ में आता है:

खाली JSON शरीर।

सबसे अच्छा तरीका URL Google Apps में लाने के लिए शायद their API for it है और मैं इसे अनुरोधों के आराम के लिए पता उपयोग कर रहा हूँ। (जो GAE का उपयोग कर रहे हैं और httplib, urllib2 और दूसरों के बीच संघर्ष के लिए)।

पोस्ट के लिए उपयोग की गई पोस्ट this one थी।

मैंने स्पॉटिफ़ी से पूछा है कि क्या कोई विकल्प है और उनके द्वारा प्रतिक्रिया Disqus पर मेरी टिप्पणी को हटाना था !!

+0

इस पर एक अद्यतन। [आरएफसी 7231 धारा 4.3.5] (https://tools.ietf.org/html/rfc7231#section-4.3.5), जो आरएफसी 2616 के लिए आपका लिंक छेड़छाड़ करता है, कहता है कि "एक डेली अनुरोध संदेश में एक पेलोड नहीं है परिभाषित अर्थशास्त्र; एक DELETE अनुरोध पर एक पेलोड निकाय भेजना कुछ मौजूदा कार्यान्वयन अनुरोध को अस्वीकार कर सकता है। " यह कहने जैसा नहीं है कि DELETE पर एक पेलोड प्रतिबंधित है: इसे पूरी तरह से अनुमति है। हालांकि, इसका मतलब है कि एक का उपयोग करना मुश्किल है और सबसे अच्छा बचा है। – Lukasa

+0

जब हम यहां हैं, तो यह ध्यान देने योग्य हो सकता है कि जब आप GAE का उपयोग नहीं कर रहे हैं तो सभी पाइथन HTTP पुस्तकालय आपको शरीर भेजने की अनुमति देते हैं: केवल GAE पर ही वे इसे मना करते हैं। – Lukasa

+0

धन्यवाद @ लुकासा, मैंने अपना जवाब नए आरएफसी के साथ संपादित किया है। जवाब वही बना हुआ है क्योंकि Spotify Disqus पर मेरी टिप्पणी हटा दी – NBajanca

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