2015-02-17 24 views
16

Sto tentando di utilizzare il modulo delle richieste Python per emettere i comandi Http GET per accedere ad alcune API basate su REST. Gli URL stanno funzionando bene su un RESTClient ma quando uso lo stesso url in python, ottengo un errore di connessione.Python requests.exception.ConnectionError: connessione interrotta "BadStatusLine"

Il codice che sto cercando di eseguire è:

payload={"mac":new_mac,"token":token} 
userloginurl="http://192.168.1.40:9119/uid" 
r=requests.get(userloginurl,params=payload) 
print(r.url) 

Se risulto questo URL utilizzando RESTClient, ottengo un codice di stato 200 OK nell'intestazione di risposta insieme ad alcuni altri campi. enter image description here Ma questo non funziona con le richieste python. Di seguito è riportato il traceback dell'errore:

Traceback (most recent call last): 
File "getAPids.py", line 34, in <module> 
r=requests.get(userloginurl,params=payload) 
    File "C:\Users\garvitab\python\lib\site-packages\requests\api.py", line 65, in 
get 
return request('get', url, **kwargs) 
File "C:\Users\garvitab\python\lib\site-packages\requests\api.py", line 49, in 
request 
response = session.request(method=method, url=url, **kwargs) 
File "C:\Users\garvitab\python\lib\site-packages\requests\sessions.py", line 4 
61, in request 
resp = self.send(prep, **send_kwargs) 
File "C:\Users\garvitab\python\lib\site-packages\requests\sessions.py", line 5 
73, in send 
r = adapter.send(request, **kwargs) 
File "C:\Users\garvitab\python\lib\site-packages\requests\adapters.py", line 4 
15, in send 
raise ConnectionError(err, request=request) 
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''", 
)) 

Ho cercato la causa del problema. Probabilmente, la risposta ricevuta non è stata formattata correttamente. C'è un modo per gestire questo problema?

Grazie in anticipo.

risposta

18

Il problema era con l'URL. Questa connessione doveva essere stabilita su https e stavo usando http nello script python. Da qui il problema.

+0

funziona grazie – einverne

+1

Felice di poter aiutare :) – BajajG

2

Avete effettivamente controllato, cosa viene inviato sul filo? Suppongo che potrebbe essere necessario convertire il dizionario in una stringa JSON da solo o utilizzare la parola chiave json= anziché payload=. Vedi http://docs.python-requests.org/en/latest/user/quickstart/#custom-headers per i dettagli. Questo può fare il trucco:

import json 
payload = json.dumps({"mac":new_mac,"token":token}) 
userloginurl = "http://192.168.1.40:9119/uid" 
r = requests.get(userloginurl, data=payload) 
print(r.url) 
+0

Grazie per aver risposto. Ho provato questo approccio ma l'errore persiste ancora. Secondo altre domande SO su questo argomento, si tratta di un problema di risposta formattata erroneamente generata dal server o di un codice di stato sconosciuto generato nella risposta. Sto ancora cercando di capire la causa esatta dell'errore. – BajajG

+0

Uno dei modi più rapidi per scoprire cosa non funziona nelle connessioni non crittografate consiste semplicemente nel sniffare il traffico utilizzando wireshark per entrambe le richieste e confrontare la differenza. Sul traffico crittografato, abilitare l'output di debug delle richieste non elaborate inviate. – Michael

+0

Grazie per il suggerimento ma il vero problema era con l'url. – BajajG

Problemi correlati