2015-02-17 21 views
16

Próbuję użyć modułu zapytań Python do wydawania komend Http GET, aby uzyskać dostęp do niektórych interfejsów API opartych na REST. Adresy URL działają poprawnie na RESTClient, ale gdy używam tego samego adresu URL w pythonie, pojawia się błąd połączenia.Python requests.exception.ConnectionError: połączenie przerwane "BadStatusLine"

Kod próbuję wykonać jest:

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

Gdybym przetestować ten adres URL przy użyciu RESTClient, pojawia się kod stanu 200 OK w nagłówku odpowiedzi wraz z kilkoma więcej pól. enter image description here Ale to nie działa z pytaniami Pythona. Monitorowanie błędu jest pokazane poniżej:

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("''", 
)) 

Poszukałem przyczyny problemu. Być może otrzymana odpowiedź nie jest poprawnie sformatowana. Czy istnieje sposób na rozwiązanie tego problemu?

Z góry dziękuję.

Odpowiedz

18

Problem dotyczył adresu URL. To połączenie miało zostać ustanowione przez https i używałem http w skrypcie pythona. Stąd problem.

+0

dziękuje – einverne

+1

Cieszę się, że mogłem pomóc :) – BajajG

2

Czy rzeczywiście sprawdziłeś, co jest wysyłane przez przewód? Przypuszczam, że możesz przekonwertować swój słownik na ciąg JSON samodzielnie lub użyć słowa kluczowego json= zamiast payload=. Aby uzyskać szczegółowe informacje, patrz http://docs.python-requests.org/en/latest/user/quickstart/#custom-headers. Może to zrobić:

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

Dzięki za odpowiedź. Próbowałem tego podejścia, ale błąd nadal występuje. Zgodnie z innymi pytaniami SO na ten temat, jest to problem nieprawidłowo sformatowanej odpowiedzi generowanej przez serwer lub nieznanego kodu statusu wygenerowanego w odpowiedzi. Nadal próbuję ustalić dokładną przyczynę błędu. – BajajG

+0

Jednym z najszybszych sposobów, aby dowiedzieć się, co dzieje się źle w niezaszyfrowanych połączeniach, jest po prostu pociągnięcie za ruch za pomocą wireshark dla obu żądań i porównanie różnicy. W przypadku zaszyfrowanego ruchu włącz wyjście do debugowania wysłanych nieprzetworzonych żądań. – Michael

+0

Dzięki za sugestię, ale prawdziwym problemem był adres URL. – BajajG

Powiązane problemy