Format komunikatu HTTP
Specyfikacje protokołu HTTP [RFC 1945; RFC 2616; RFC 7540] uwzględniają definicje formatów komunikatów HTTP. Można wyróżnić dwa typy komunikatów HTTP — komunikaty żądania i odpowiedzi. Omówiono je poniżej.
Komunikat żądania HTTP
Poniżej przedstawiliśmy typowy komunikat żądania HTTP:
Host: www.uczelnia.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
Gdy dokładnie przyjrzymy się temu prostemu komunikatowi żądania, możemy się wiele dowiedzieć. Po pierwsze, widać, że komunikat został zapisany w zwykłym formacie ASCII. Dzięki temu może go odczytać osoba, która w podstawowym zakresie opanowała obsługę komputera. Po drugie, można stwierdzić, że komunikat składa się z pięciu wierszy, z których każdy jest zakończony znakiem powrotu karetki i wysuwu wiersza. Na końcu ostatniego wiersza znajduje się dodatkowy znak powrotu karetki i wysuwu wiersza. Choć ten przykładowy komunikat żądania posiada pięć wierszy, może być ich znacznie więcej lub zaledwie jeden. Pierwszy wiersz komunikatu żądania HTTP jest nazywany wierszem żądania. Kolejne wiersze określa się mianem wierszy nagłówka. Wiersz żądania posiada trzy pola — pole metody, adresu URL i wersji protokołu HTTP. W polu metody może się znaleźć kilka różnych wartości, takich jak GET, POST, HEAD, PUT i DELETE. Zdecydowana większość komunikatów żądań HTTP korzysta z metody GET, która jest używana, gdy przeglądarka żąda obiektu. W tym przypadku obiekt jest identyfikowany w polu adresu URL. W przytoczonym przykładzie przeglądarka żąda obiektu /katalog/strona.html. Pole wersji nie wymaga komentarza. W przykładzie przeglądarka obsługuje wersję HTTP/1.1.
Przyjrzyjmy się teraz wierszom nagłówka podanym w przykładzie. Wiersz Host: www.uczelnia.edu identyfikuje host przechowujący obiekt. Można pomyśleć, że wiersz ten nie jest potrzebny, gdy z hostem będzie już nawiązane połączenie TCP. Informacje znajdujące się w tym wierszu nagłówka są wymagane przez serwer pośredniczący (ang. proxy) buforujący strony internetowe. Gdy zastosuje się wiersz Connection: close, przeglądarka informuje serwer, że nie chce mieć do czynienia z połączeniami trwałymi. Oznacza to, że po wysłaniu żądanego obiektu serwer ma zakończyć połączenie. Wiersz nagłówka User-agent: określa agenta użytkownika, czyli typ przeglądarki wysyłającej żądanie do serwera.
W przytoczonym przykładzie agentem jest przeglądarka Mozilla/5.0 (Firefox). Ten wiersz nagłówka jest przydatny, ponieważ serwer może różne wersje tego samego obiektu wysyłać do różnego typu agentów użytkownika (każda wersja jest identyfikowana przez ten sam adres URL). Z kolei wiersz nagłówka Accept-language: wskazuje, że użytkownik woli otrzymać obiekt oferujący francuską wersję językową (jeśli taka istnieje). W przeciwnym razie serwer powinien przesłać domyślną wersję językową obiektu. Nagłówek Accept-language: jest tylko jednym z wielu nagłówków oferowanych przez protokół HTTP związanych z negocjowaniem treści. Po zapoznaniu się z przykładem przyjrzyjmy się teraz bardziej ogólnemu formatowi komunikatu żądania pokazanemu na rysunku 2.8. Widać na nim, że ogólny format jest bardzo zbliżony do omawianego w przykładzie. Można jednak zauważyć, że poniżej wierszy nagłówka (oraz dodatkowych znaków powrotu karetki i wysuwu wiersza) znajduje się treść komunikatu. W przypadku metody GET treść komunikatu nie jest stosowana, natomiast metoda POST korzysta z niej. Klient HTTP często używa metody POST, gdy użytkownik wypełnia formularz (na przykład wprowadza słowa w polach wyszukiwarki). W przypadku metody POST użytkownik nadal żąda pobrania strony internetowej z serwera WWW. Jednak zawartość strony będzie zależna od tego, co użytkownik poda w polach formularza. Jeśli wartością pola metody jest POST, wiersz treści komunikatu będzie zawierał dane wprowadzone przez użytkownika w polach formularza.
Zaniedbaniem byłoby pominięcie tego, że żądanie generowane w przypadku formularza niekoniecznie korzysta z metody POST. Formularze HTML często używają metody GET i w adresie URL zawartym w żądaniu uwzględniają dane wprowadzone w polach. Jeśli na przykład formularz stosuje metodę GET i posiada dwa pola, w których wstawiono łańcuchy malpy i banany, adres URL będzie miał postać www.witryna.com/zwierzeszukanie?malpy&banany. W czasie codziennego przeglądania stron internetowych prawdopodobnie Czytelnik spotkał się z tego typu rozbudowanym adresem URL. Metoda HEAD przypomina metodę GET. Gdy serwer odbierze żądanie z metodą HEAD, odeśle komunikat HTTP, który jednak będzie pozbawiony żądanego obiektu. Z metody HEAD często korzystają projektanci aplikacji podczas debugowania. Metoda PUT jest często wykorzystywana razem z narzędziami służącymi do publikowania danych na stronach internetowych. Metoda pozwala użytkownikowi umieścić obiekt w określonej lokalizacji (katalogu) wybranego serwera WWW. Metoda PUT jest też stosowana przez aplikacje wymagające zapisywania obiektów na serwerach WWW. Metoda DELETE umożliwia użytkownikowi lub aplikacji usunięcie obiektu znajdującego się na serwerze WWW.
Rysunek 2.8. Ogólny format komunikatu żądania
Komunikat odpowiedzi HTTP
Poniżej zamieszczono typowy komunikat odpowiedzi HTTP. Komunikat mógłby być odpowiedzią na wcześniej podany przykładowy komunikat żądania.
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(dane dane dane dane dane ...)
Przyjrzyjmy się dokładnie powyższemu komunikatowi odpowiedzi. Komunikat zawiera trzy sekcje — początkowy wiersz statusu, sześć wierszy nagłówka i treść komunikatu. Treścią komunikatu jest sam żądany obiekt (reprezentowany przez wiersz (dane dane dane dane dane ...)). Wiersz statusu posiada trzy pola — pole wersji protokołu, pole kodu statusu i powiązane z nim pole komunikatu statusu. W przytoczonym przykładzie wiersz statusu wskazuje, że serwer korzysta z protokołu HTTP/1.1. Komunikat OK potwierdza, że wszystko jest w porządku (oznacza to, że serwer znalazł żądany obiekt i wysyła go).
Spójrzmy teraz na wiersze nagłówka. Serwer używa wiersza nagłówka Connection: close, aby poinformować klienta, że wysłanie komunikatu zakończy połączenie TCP. Wiersz nagłówka Date: podaje datę i godzinę utworzenia komunikatu odpowiedzi HTTP i wysłania go przez serwer. Warto zauważyć, że nie jest to czas utworzenia obiektu lub jego ostatniej modyfikacji. Jest to czas pobrania obiektu przez serwer ze swojego systemu plików, umieszczenia obiektu w komunikacie odpowiedzi i wysłania go.
Wiersz nagłówka Server: wskazuje, że komunikat został wygenerowany przez serwer Apache. Wiersz ten odpowiada wierszowi nagłówka User-agent: znajdującemu się w komunikacie żądania HTTP. Wiersz nagłówka Last-Modified identyfikuje datę i godzinę utworzenia obiektu lub jego ostatniej modyfikacji. Nagłówek ten, który niedługo zostanie omówiony bardziej szczegółowo, odgrywa istotną rolę w przypadku buforowania obiektów (dotyczy to zarówno lokalnego klienta, jak i sieciowych serwerów buforujących nazywanych też serwerami pośredniczącymi). Wiersz nagłówka Content-Length: określa liczbę bajtów wysyłanego obiektu. Wiersz nagłówka Content-Type: wskazuje, że obiektem umieszczonym w treści komunikatu jest plik HTML (typ obiektu jest oficjalnie określany przez nagłówek Content-Type:, a nie przez rozszerzenie nazwy pliku).
Po przeanalizowaniu przykładu omówimy teraz ogólny format komunikatu odpowiedzi przedstawionego na rysunku 2.9. Ogólny format komunikatu odpowiedzi jest zgodny z powyższym przykładowym komunikatem. W kilku słowach należy opisać kody statusu i powiązane z nimi komunikaty, które identyfikują wynik żądania. Oto kilka często stosowanych kodów statusu i ich komunikatów:
- 200 OK. Żądanie się powiodło i w odpowiedzi są zwracane dane.
- 301 Moved Permanently. Żądany obiekt został trwale przeniesiony. W nagłówku Location: komunikatu odpowiedzi jest umieszczany nowy adres URL. Klient automatycznie pobierze nowy adres URL.
- 400 Bad Request. Jest to ogólny kod o błędzie, wskazujący, że żądanie nie mogło być przetworzone przez serwer.
- 404 Not Found. Żądany dokument nie istnieje na serwerze.
- 505 HTTP Version Not Supported. Żądana wersja protokołu HTTP nie jest obsługiwana przez serwer.
W jaki sposób zobaczyć rzeczywisty komunikat odpowiedzi HTTP? Operacja jest szczególnie polecana i bardzo łatwa do wykonania! Najpierw za pomocą narzędzia Telnet należy połączyć się z ulubionym serwerem WWW, a następnie wprowadzić jednowierszowy komunikat żądania pobrania określonego obiektu znajdującego się na serwerze. Po uzyskaniu dostępu do wiersza poleceń można na przykład wpisać następujące wiersze:
GET /kurose_ross/interactive/index.php HTTP/1.1
Host: gaia.cs.umass.edu
Na końcu ostatniego wiersza należy dwukrotnie wprowadzić znak powrotu karetki. W efekcie zostanie nawiązane połączenie TCP z portem 80 hosta gaia.cs.umass.edu, a następnie wysłany komunikat żądania HTTP. Powinien pojawić się komunikat odpowiedzi zawierający podstawowy plik HTML strony internetowej z interaktywnymi zadaniami z tej książki. Aby zamiast samego obiektu odebrać tylko wiersze komunikatu HTTP, w miejsce metody GET należy wstawić metodę HEAD.
Opracowano na podstawie: