2015-01-27 11 views
5

Dopo aver cercato per un po ', ho trovato le seguenti soluzioni per una chiamata API che richiede il metodo Delete.Python Delete Request for a api resto (su gae)

Prima prova: (biblioteca 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) 

Ciò restituisce:

{u'error ': {u'status': 400, u'message ': u'Empty JSON corpo '}}

secondo tentativo:. (biblioteca 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 

Ciò restituisce:

HTTP 400 Richiesta

ho altre funzioni in cui il JSON sta lavorando, quindi credo che il problema sia con il metodo DELETE ma non riesco a farlo funzionare.

Oltre a ciò, la webapp è in esecuzione su google app engine quindi non posso installare i pacchetti quindi vorrei rimanere nei librerie preinstallati.
Qualcuno ha un buon modo per fare una richiesta di cancellazione su GAE? (Devo inviare sia dati che intestazioni)

L'API è spotify: developer.spotify.com/web-api/ e sto tentando di eliminare una traccia da una playlist.

+1

Grazie mille per lo sforzo di porre la tua domanda. Hai rinnovato la mia fiducia in SO, almeno per un giorno. –

+0

Il tuo secondo esempio sembra strano Hai considerato di provare solo urlfetch: supporta il metodo DELETE. https://cloud.google.com/appengine/docs/python/urlfetch/fetchfunction –

+0

Ho provato a utilizzare urlfetch e ottengo questa risposta: {u'error ': {u'status': 400, u 'message': u'Empty JSON body. '}} – NBajanca

risposta

3

Dopo molte ricerche, ho scoperto che è impossibile.

Come affermato in RFC 7231 (grazie a @lukasa per aver ricordato che RFC 2616 è obsoleto), per quanto riguarda il metodo Delete:

Le richieste metodo delete che il server di origine rimuovere l'associazione tra la risorsa di destinazione e la sua attuale funzionalità . In effetti, questo metodo è simile al comando rm in UNIX: esprime un'operazione di cancellazione sulla mappatura URI del server di origine piuttosto che un'aspettativa che le informazioni associate precedentemente a vengano eliminate.

Detto questo, l'eliminazione di una traccia non dovrebbe richiedere il passaggio di track_uri nel corpo, ma dovrebbe essere nell'URI.

Inoltre, nella RFC:

un payload all'interno di un messaggio di richiesta di eliminazione non ha semantica definita; l'invio di un corpo del payload su una richiesta DELETE potrebbe causare alcune implementazioni esistenti per rifiutare la richiesta.

Google App Engine è uno di questi casi, non consentendo a una richiesta DELETE di avere un corpo.

che dicono che la risposta da Spotify rende tutto il senso:

vuoto corpo JSON.

Il modo migliore per prendere in URL app Google è probabilmente their API for it e lo sto usando sa per il resto delle richieste. (Per quelli che utilizzano GAE e lottano tra httplib, urllib2 e altri).

Il post che ho utilizzato come riferimento è stato this one.

Ho chiesto a Spotify se c'è un'alternativa e la risposta da loro è stata la rimozione del mio commento su Disqus !!

+0

Un aggiornamento su questo. [RFC 7231 Sezione 4.3.5] (https://tools.ietf.org/html/rfc7231#section-4.3.5), che sostituisce il collegamento a RFC 2616, afferma che "Un payload all'interno di un messaggio di richiesta DELETE non ha semantica definita: l'invio di un corpo del payload su una richiesta DELETE potrebbe far sì che alcune implementazioni esistenti rifiutino la richiesta. " Questo non equivale a dire che un carico utile su DELETE è vietato: è completamente consentito. Tuttavia, significa che l'utilizzo di uno è difficile e meglio evitare. – Lukasa

+0

Mentre siamo qui, potrebbe essere utile notare che tutte le librerie HTTP Python ti permettono di inviare un corpo quando non stai usando GAE: solo su GAE lo proibiscono. – Lukasa

+0

Grazie a @Lukasa, ho modificato la mia risposta con la nuova RFC. La risposta rimane la stessa perché Spotify ha rimosso il mio commento su Disqus – NBajanca