2015-08-28 24 views
5

Chciałbym zrobić HTTP DELETE z modułem zapytań Pythona, który następuje poniżej API;HTTP Usuń za pomocą modułu zapytań python

https://thingspeak.com/docs/channels#create

DELETE https://api.thingspeak.com/channels/4/feeds 
     api_key=XXXXXXXXXXXXXXXX 

Używam Pythona v2.7 i żąda moduł. Mój kod python wygląda tak;

def clear(channel_id):  
    data = {} 
    data['api_key'] = 'DUCYS8xufsV613VX' 
    URL_delete = "http://api.thingspeak.com/channels/" + str(channel_id) + "/feeds" 
    r = requests.delete(URL_delete, data) 

Kod nie działa, ponieważ request.delete() może zaakceptować tylko jeden parametr. Jak powinien wyglądać poprawny kod?

Odpowiedz

4

Chcesz

import json 
mydata = {} 
mydata['api_key'] = "Jsa9i23jka" 
r = requests.delete(URL_delete, data=json.dumps(mydata)) 

Musisz użyć nazwie wejście, „dane” i zgaduję, że rzeczywiście chcesz JSON dumpingowych, więc trzeba przekonwertować słownika „” Do mydata ciąg jsonów. Możesz użyć json.dumps() do tego.

Nie wiem API, którego używasz, ale dźwięk to rzeczywiście chcesz przekazać parametr URL, a nie dane, do tego trzeba:

r = requests.delete(URL_delete, params=mydata) 

Nie ma potrzeby konwertowania mydata dict do łańcucha json.

+0

Dzięki! Testowana jako poprawna odpowiedź. Działa druga metoda. Jedna rzecz, której nie rozumiem. Dlaczego 'r = requests.delete (URL_delete, mydata)' nie działa, ale 'r = requests.delete (URL_delete, params = mydata)' działa? W przypadku Postu HTTP nie muszę używać parametrów. Dlaczego różnica? – user781486

+3

Jeśli spojrzysz na https://github.com/kennethreitz/requests/blob/master/requests/api.py. Możesz zobaczyć, że 'post' jest zdefiniowany jako' post (url, data = None ...) 'podczas gdy delete jest zdefiniowany jako' delete (url, ** kwargs) '. Kwargs oznacza, że ​​musi to być "kluczowy argument". Prace postu powodują jawne wyszczególnienie niektórych argumentów. –

2

Możesz wysyłać parametry danych jako sugerowane @Eugene, ale konwencjonalnie usuwaj tylko żądania zawiera adres URL i nic więcej. Powodem jest to, że URL RESTful powinien jednoznacznie identyfikować zasób, eliminując w ten sposób potrzebę dostarczania dodatkowych parametrów do usunięcia. Z drugiej strony, jeśli twój "APIKEY" ma coś wspólnego z uwierzytelnianiem, to powinien być częścią nagłówków zamiast danych żądania, coś w tym stylu.

headers = {'APIKEY': 'xxx'} 
response = requests.delete(url, data=json.dumps(payload), headers=headers)