2015-10-14 12 views
5

Per qualche motivo la mia richiesta di inserimento non funziona e vengono visualizzati errori di sintassi. Sono nuovo di Python ma ho le mie richieste GET e POST di lavoro. Qualcuno vede qualcosa di sbagliato in questa richiesta e qualche raccomandazione? Sto cercando di modificare la descrizione "Descrizione cambiato"PUT Richiesta all'API REST utilizzando Python

PUT

#import requests library for making REST calls 
import requests 
import json 

#specify url 
url = 'my URL' 

token = "my token" 

data = { 
     "agentName": "myAgentName", 
     "agentId": "20", 
     "description": "Changed Description", 
     "platform": "Windows" 
     } 

headers = {'Authorization': 'Bearer ' + token, "Content-Type": "application/json", data:data} 

#Call REST API 
response = requests.put(url, data=data, headers=headers) 

#Print Response 
print(response.text) 

Qui è l'errore che sto ottenendo.

Traceback (most recent call last): 
    line 17, in <module> 
    headers = {'Authorization': 'Bearer ' + token, "Content-Type": "application/json", data:data} 
TypeError: unhashable type: 'dict' 
+0

* Per qualche ragione la mia richiesta put non funziona e io sono sempre errori di sintassi. * Ovviamente, è fondamentale che si copiare e incollare questi errori qui, perché saranno più probabilmente risolverà il problema * all'istante *. –

+0

Sono d'accordo con te. Ho aggiornato il mio post originale sopra insieme con l'errore. – Tim

+1

Hai i tuoi 'dati' nelle tue intestazioni - presumibilmente hai solo bisogno di cancellare i dati dalle intestazioni che hai già passato come parametro' data'. – AChampion

risposta

3

Errore di sintassi nella causa di = segno nel vostro dizionario headers:

headers = {'Authorization': 'Bearer ' + token, "Content-Type": "application/json", data=data} 

dovrebbe essere:

headers = {'Authorization': 'Bearer ' + token, "Content-Type": "application/json", 'data':data} 

Vedi data=data è cambiato con 'data':data. Colon e singole virgolette.

E sei sicuro di voler inviare i dati nelle intestazioni? O dovresti sostituire il tuo payload con data nella tua richiesta put?

Edit:

Come si è modificato la questione e ora si stanno inviando i dati come il corpo di richiesta PUT requests.put(data=data) quindi non c'è bisogno di esso nelle intestazioni. Basta cambiare le intestazioni a:

headers = {'Authorization': 'Bearer ' + token, "Content-Type": "application/json"} 

Ma, come è stato impostato l'intestazione Content-Type a application/json quindi penso che nella richiesta PUT si dovrebbe fare

response = requests.put(url, data=json.dumps(data), headers=headers) 

che è inviare i dati come JSON.

+0

Ho apportato le modifiche al mio post originale ma continuo a ricevere un errore. Qualche idea in più? – Tim

+1

@Tim ti mancano ancora le virgolette singole attorno ai tuoi "dati": dati ". 'data' è un dict che non può essere una chiave per un altro titolo. –

+0

sei corretto. Questo è quello che dovevo fare. Grazie. – Tim

1

Il problema è che si tenta di assegnare data all'elemento data nel dizionario:

headers = { ..., data:data } 

Questo non può funzionare perché non è possibile utilizzare un dizionario come chiave in un dizionario (tecnicamente, perché non è lavabile).

Probabilmente voleva fare

headers = { ..., "data":data } 
+0

Sfortunatamente Marcus il problema non era con le virgolette mancanti intorno ai dati, ma i dati non dovrebbero essere stati nella mia intestazione all'inizio. – Tim

+0

@Tim Ho preso il codice direttamente dal tuo messaggio di errore, quindi era decisamente lì! –

+0

Assicurati sempre che il codice che inserisci sia esattamente il codice con cui hai problemi –