HTTP - Czyli co? - HTTP Dla Początkujących Web Developerów


Spis treści



Wstęp

Na wstępie zaznaczę, abyś nie przejmował się, iż czegoś nie zrozumiałeś, bo może być to również wina autora tekstu ;). Jeśli coś wydało Ci się niejasne, zadaj pytanie na naszym serwerze discord -> https://discord.gg/pBH7zZSvmy.

HTTP (Hypertext Transfer Protocol) - protokół (7 warstwy modelu OSI) przesyłania dokumentów hipertekstowych.

HTTP to protokół bezstanowy, znaczy to, tyle że ani serwer, ani klient nie łączy ze sobą w sesję wcześniejszych zapytań. Co nie oznacza, że śledzenie sesji użytkownika nie jest możliwe, ale do tego przejdę w punkcie poświęconym nagłówkom.

W protokole można wyróżnić dwa główne elementy:

  • nagłówki (headers)
  • ciało (body)

HTTP 1.1 definiuje standard RFC2616. Artykuł jest wyłącznie o HTTP w wersji 1.1.

Co to jest model OSI?

Model OSI - to pokrótce standard opisujący strukturę komunikacji w sieci komputerowej.

HTTP jest protokołem ostatniej warstwy - warstwy aplikacyjnej, komunikacja opiera się na protokole TCP.

TCP jest protokołem 4 warstwy - warstwy transportowej.


Zapytania


Pierwsza linia zapytania

Pierwszą linią w protokole HTTP zawsze jest:

  1. metoda
  2. adres URL
  3. wersja protokołu

GET /host/some HTTP/1.1

Następne linie zapytania

  • nagłówki (jedynym obowiązkowym nagłówkiem jest Host)
  • ciało zapytania (jeśli metoda HTTP na to pozwala)

Ciało zapytania jest zawsze oddzielone od nagłówków znakiem CRLF. Jeśli nie wiesz, co to jest, to nie przejmuj się, poruszę ten temat w punkcie Surowe Zapytanie/Odpowiedź.

Metody HTTP

Jak widać zmiana metody HTTP wiąże się ze zmianą ciągu znaków w pierwszej linii zapytania. Do funkcjonalności metod przejdziemy w następnym punkcie.

W takim razie czy metody HTTP są kwestią umowną?

Zdecydowanie nie, bo każdy serwer HTTP implementuje obsługę poszczególnych metod zgodnie ze specyfikacją. Co oznacza, że np. metoda GET (według specyfikacji protokołu HTTP) nie może mieć ciała zapytania (request body).


Metody

Nie przedstawię tutaj wszystkich metod HTTP, lecz te najczęściej wykorzystywane.

MetodaRequest BodyResponse BodyZastosowanie
GETnieopcjonalniePobieranie zasobu
POSTopcjonalnieopcjonalnieTworzenie zasobu
PUTopcjonalnieopcjonalnieAktualizacja zasobu
DELETEopcjonalnieopcjonalnieUsuwanie zasobu
HEADnieniePobranie metadanych (nagłówków)

URL vs URI

Często widzę, że URL i URI są używane na przemian, niczym synonimy, ale to nie jest to samo.

URL

URL (Uniform Resource Locator) - jest właściwie podzbiorem zbioru URI. Wskazuje on na lokalizację i obsługiwany protokół (np. http, ftp, ...).

URI

URI (Uniform Resource Identifier) - jest tym wcześniej przytoczonym nadzbiorem, zdefiniowanym przez standard RFC 3986. W przeciwieństwie do URL, zawiera on informacje o zasobie.

Przykłady:

ldap://[2001:db8::7]/c=GB?objectClass?one

mailto:[email protected]

news:comp.infosystems.www.servers.unix


Nagłówki

Nagłówki HTTP (HTTP headers) - są częścią zapytania, jak i odpowiedzi. Ważną kwestią jest, iż protokół HTTP 1.1 wymaga jedynie obecności nagłówka Host.

Nagłówki mają następującą składnie:

klucz: wartość

Przykład:

Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 03 May 2022 09:36:17 GMT
Content-Type: text/html
Content-Length: 166
Connection: close

Odpowiedzi


Pierwsza linia odpowiedzi

Pierwsza linia odpowiedzi zawiera:

  1. wersję protokołu
  2. status odpowiedzi

To, jaki status znajdzie się w odpowiedzi definiuje logika serwera np. wiedząc, że protokół HTTP 1.1 wymaga obecności nagłówka Host, to gdy spróbujemy wysłać do serwera zapytanie bez niego, otrzymamy status 400 (BAD REQUEST).

Bez nagłówka: ``` GET / HTTP/1.1

HTTP/1.1 400 Bad Request <---- Server: nginx/1.18.0 (Ubuntu) Date: Tue, 03 May 2022 09:36:17 GMT Content-Type: text/html Content-Length: 166 Connection: close

...

Z nagłówkiem:

GET / HTTP/1.1 Host: asdf <----

HTTP/1.1 200 OK <---- Server: nginx/1.18.0 (Ubuntu) Date: Tue, 03 May 2022 10:10:31 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Mon, 02 May 2022 18:28:59 GMT Connection: keep-alive ETag: "627022eb-264" Accept-Ranges: bytes

<!DOCTYPE html> ... ```

Kolejne linie odpowiedzi

  • nagłówki
  • ciało odpowiedzi (opcjonalnie)

Surowe Zapytanie/Odpowiedź

We wcześniejszych punktach pokazałem przykłady zapytań wysyłanych netcat'em. Teraz omówię dokładniej, jak wyglądają surowe zapytania HTTP.

Zatem zacznijmy od prostego zapytania do serwera zwracającego odpowiedź z HTMLem.

GET /file.html HTTP/1.1
Host: localhost

HTTP/1.1 200 OK
Server: Techniczniej-SRV
Date: Tue, 03 May 2022 10:39:12 GMT
Content-type: text/html
Content-Length: 14
Last-Modified: Tue, 03 May 2022 08:09:09 GMT

<h1>asdf</h1>

Rzecz którą pominąłem to znaki:

  • \r
    • Carriage Return (heksadecymalnie 0x0d)
  • \n
    • Line Feed (heksadecymalnie 0x0a)

czyli CRLF (Carriage Return Line Feed) - seknwencja końca linii (EOL - End of Line). Analogicznie nie widać tej sekwencji znaków w terminalu, lub dokumentach tekstowych, ponieważ jest interpretowana jako nowa linia.

Oddzielanie nagłówków

Każdy nagłówek jest od siebie odzielony pojedynczym znakiem CRLF.

Ale o co chodzi z tym ostatnim znakiem \r\n ?

Ten ostatni znak CRLF oddziela nagłówki HTTP od ciała odpowiedzi.

Content-type: text/html\r\n
Content-Length: 24\r\n
\r\n
<p>ciało odpowiedzi</p>

Dla lepszej wizualizacji pokażę to w jednej linii.

Content-type: text/html\r\nContent-Length: 24\r\n\r\n<p>ciało odpowiedzi</p>

Mam nadzieję, że ten artykuł zwiększył nieco Twoje pojmowanie swego rodzaju abstrakcji.


Podobne artykuły