Zanurkuj w Pythonie/Debugowanie serwisów HTTP
Debugowanie serwisów HTTP
edytujNa początek włączmy debugowanie w pythonowej bibliotece HTTP i zobaczmy co zostanie przesłane. Wiadomości zdobyte poprzez przeanalizowanie wypisanych informacji debugujących, będą przydatne w tym rozdziale, gdy będziemy chcieli dodać nowe możliwości do naszego programu.
Przykład. Debugowanie HTTP
>>> import httplib
>>> httplib.HTTPConnection.debuglevel = 1 #(1)
>>> import urllib
>>> feeddata = urllib.urlopen('http://diveintomark.org/xml/atom.xml').read()
connect: (diveintomark.org, 80) #(2)
send: '
GET /xml/atom.xml HTTP/1.0 #(3)
Host: diveintomark.org #(4)
User-agent: Python-urllib/1.15 #(5)
'
reply: 'HTTP/1.1 200 OK\r\n' #(6)
header: Date: Wed, 14 Apr 2004 22:27:30 GMT
header: Server: Apache/2.0.49 (Debian GNU/Linux)
header: Content-Type: application/atom+xml
header: Last-Modified: Wed, 14 Apr 2004 22:14:38 GMT #(7)
header: ETag: "e8284-68e0-4de30f80" #(8)
header: Accept-Ranges: bytes
header: Content-Length: 26848
header: Connection: close
urllib
jest zależny od innej standardowej biblioteki Pythona:httplib
. Zwykle nie musimy importować modułuhttplib
bezpośrednio (urllib
robi to automatycznie), ale w tym wypadku to zrobiliśmy, a więc możemy ustawić flagę trybu debugowania w klasieHTTPConnection
, którą modułurllib
wykorzystuje wewnętrznie do nawiązania połączenia z serwerem HTTP. To jest niezwykle przydatna technika. Kilka innych bibliotek Pythona ma podobne flagi trybu debugowania, ale nie ma jakiegoś szczególnego standardu nazywania ich i ustawiania; trzeba przeczytać dokumentację każdej biblioteki, aby zobaczyć, czy taka flaga jest dostępna.- Teraz gdy już flagę debugowania mamy ustawioną, informacje na temat żądań HTTP i odpowiedzi są wyświetlane w czasie rzeczywistym. Pierwszą rzeczą jaką możemy zauważyć jest to, iż łączymy się z serwerem diveintomark.org na porcie 80, który jest standardowym portem dla HTTP.
- Gdy zgłaszamy żądanie po zasobów RSS,
urllib
wysyła trzy linie do serwera. Pierwsza linia zawiera polecenie HTTP i ścieżkę do zasobu (bez nazwy domeny). Wszystkie żądania w tym rozdziale będą używały polecenia GET, ale w następnym rozdziale o SOAP zobaczymy, że tam do wszystkiego używane jest polecenie POST. Podstawowa składnia jest jednak taka sama niezależnie od polecenia. - Druga linia odnosi się do nagłówka Host, który zawiera nazwę domeny serwisu, do którego kierujemy żądanie. Jest to istotne, ponieważ pojedynczy serwer HTTP może obsługiwać wiele oddzielnych domen. Na tym serwerze jest aktualnie obsługiwanych 12 domen; inne serwery mogą obsługiwać setki lub nawet tysiące.
- Trzecia linia to nagłówek User-Agent. To co tu widać, to jest standardowy nagłówek User-Agent dodany domyślnie przez bibliotekę
urllib
. W następnej sekcji pokażemy jak zmienić to na coś bardziej konkretnego. - Serwer odpowiada kodem statusu i kilkoma nagłówkami (być może z jakimiś danymi, które zostały zachowane w zmiennej
feeddata
). Kodem statusu jest tutaj liczba 200, która oznacza "wszystko w porządku, proszę to dane o które prosiłeś". Serwer także podaje datę odpowiedzi na żądanie, trochę informacji na temat samego serwera i typ zawartości (ang. content type) zwracanych danych. W zależności od aplikacji, może być to przydatne lub też nie. Zauważmy, że zażądaliśmy RSS-a i faktycznie otrzymaliśmy RSS-a (application/atom+xml jest to zarejestrowany typ zawartości dla zasobów RSS). - Serwer podaje, kiedy ten RSS był ostatnio modyfikowany (w tym wypadku około 13 minut temu). Możemy odesłać tę datę serwerowi z powrotem następnym razem, gdy zażądamy tego samego zasobu, a serwer będzie mógł wykonać sprawdzenie daty ostatniej modyfikacji.
- Serwer podaje także, że ten RSS ma sumę kontrolną ETag o wartości "e8284-68e0-4de30f80". Ta suma kontrolna sama w sobie nie ma żadnego znaczenia; nie można z nią zrobić nic poza wysłaniem jej z powrotem do serwera przy następnej próbie dostępu do tego zasobu. Wtedy serwer może jej użyć do sprawdzenia, czy dane się zmieniły od ostatniego razu czy nie.