Pytanie Python requests.exception.ConnectionError: połączenie przerwane "BadStatusLine"


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.

Kod, który próbuję wykonać, to:

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

Jeśli przetestuję ten adres URL za pomocą RESTClient, otrzymam kod statusu 200 OK w nagłówku odpowiedzi wraz z kilkoma dodatkowymi polami. 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("''",
))

Szukał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ę.


18
2018-02-17 08:18


pochodzenie




Odpowiedzi:


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


21
2018-02-17 14:54





Czy rzeczywiście sprawdziłeś, co jest wysyłane przez przewód? Przypuszczam, że możesz sam przekonwertować słownik na ciąg JSON lub użyć skrótu json= słowo kluczowe zamiast payload=. Widzieć http://docs.python-requests.org/en/latest/user/quickstart/#custom-headers dla szczegółów. To może załatwić sprawę:

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)

3
2018-02-17 08:52



Dziękuję 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
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
Dzięki za sugestię, ale prawdziwym problemem był adres URL. - BajajG
Miałem ten błąd, ponieważ mój api używał json w ciele. Używałem tych danych kwarg do zasilania słownika. (musiały to być dane podawane jako styl danych formularza) Zmieniono je na json i błąd został rozwiązany. dzięki. - ThinkBonobo