Podstawy#

Adresy URL#

W obrębie sieci WWW adresy URL stanowią jeden z najbardziej charakterystycznych i najczęściej występujących mechanizmów, z jakim można mieć do czynienia na co dzień. Adres URL to konstrukcja służącą głównie do wskazywania lokalizacji w sieciach komputerowych, tj. miejsce, z którego dany zasób można ściągnąć (adres) i sposób, w jaki można to zrobić (protokół, np. http, ftp, ...).

Wstępne informacje związane z adresami URL umieściłem w kursie HTML (dział "Odsyłacze - Adresy internetowe").

Adresy URL przewijają się w wielu specyfikacjach WWW, dlatego w ramach uproszczenia tychże specyfikacji utworzono osobny dokument poświęcony jedynie adresom URL:

Obydwie specyfikacje są równorzędne względem siebie, ale wersja od WHATWG jest aktualna i to właśnie na jej podstawie oparłem prezentowany materiał. Pisząc "specyfikacja" lub "specyfikacja URL" mam na myśli przytoczoną wersję.

Cele wyznaczone przez specyfikację#

Specyfikacja URL standaryzuje adresy URL w sposób, który zapewni ich pełną interoperacyjność. Odbywa się to poprzez:

Obsługa przez przeglądarki internetowe#

Na dzień dzisiejszy żadna przeglądarka internetowa nie wdrożyła jeszcze (wszystkich) wymagań nowej specyfikacji URL. Wciąż obsługiwane są starsze rozwiązania, które tak naprawdę wdrożone zostały niespójnie przez poszczególne programy. W nowym ujęciu kluczowa będzie implementacja bazowego parsera adresu URL, bo od jego prawidłowej obsługi zależą wartości zwracane przez poszczególne polecenia związane z URL-ami. Bez rzeczywistej implementacji nie ma możliwości przeprowadzenia testów i weryfikacji poprawności samej specyfikacji URL, dlatego też szczegółowe opisy suchej teorii (przynajmniej obecnie) wydają się zbędne. W miarę postępów w tym obszarze będę po prostu dopisywał kolejne ciekawe niuanse, na które warto zwracać uwagę.

Niecierpliwi mogą samodzielnie śledzić postęp prac w konkretnych silnikach przeglądarek poprzez analizę zgłoszonych błędów (np. dla Firefoksa).

Wprowadzenie#

Zacznijmy od podstaw. Według aktualnej specyfikacji adres URL (lub krótko URL) to obiekt, który składa się z kilku komponentów i skojarzonych pojęć. Z praktycznego punktu widzenia nie mamy bezpośredniego dostępu do tego obiektu, ale możliwy będzie odczyt/zmiana jego poszczególnych komponentów przy użyciu specjalnych poleceń. W dużym uproszczeniu całość można zaprezentować następująco:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
// Obiekt reprezentujący adres URL
{

	"scheme": ...,			// komponent
	"scheme data": ...,		// komponent
	"username": ...,		// komponent
	"password": ...,		// komponent
	"host": ...,			// komponent
	"port": ...,			// komponent
	"path": ...,			// komponent
	"query": ...,			// komponent
	"fragment": ...,		// komponent
	"relative flag": ...,	// skojarzenie
	"object": ...			// skojarzenie

}

Adres URL (w formie obiektu) tworzy się na podstawie łańcucha znakowego, który przekazany zostaje do odpowiedniego parsera. To właśnie parser odpowiada za utworzenie obiektu reprezentującego adres URL lub aktualizację jego poszczególnych komponentów. Odczyt adresu URL lub jego poszczególnych komponentów (czyli zamiana obiektu na łańcuch znakowy) wymaga skorzystania z odpowiedniego serlilizera.

Z racji tego, że operowanie adresem URL zależy od kontekstu, to w rzeczywistości adres URL będzie kojarzony z dwoma bazowymi interfejsami zawierającymi odpowiednie polecenia: URLUtils (zezwala na odczyt i zmianę) oraz URLUtilsReadOnly (zezwala tylko na odczyt, np. w wątkach roboczych). Pierwszy z nich ma większe możliwości, dlatego to właśnie jego wyraźmy za pomocą prezentacji obiektowej:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
// Obiekt implementujący interfejs URLUtils
{

	"input": ..., 			// skojarzenie
	"query encoding": ..., 	// skojarzenie
	"query object": ..., 	// skojarzenie (obiekt URLSearchParams)
	"url": ...,				// skojarzenie (obiekt URL)

	"href": ...,			// właściwość (get/set)
	"username": ...,		// właściwość (get/set)
	"password": ...,		// właściwość (get/set)
	"host": ...,			// właściwość (get/set)
	"hostname": ...,		// właściwość (get/set)
	"port": ...,			// właściwość (get/set)
	"pathname": ...,		// właściwość (get/set)
	"search": ...,			// właściwość (get/set)
	"searchParams": ...,	// właściwość (get/set)
	"hash": ...,			// właściwość (get/set)
	"origin": ...			// właściwość (get)

}

Właściwości tak naprawdę pozwalają zmienić lub odczytać poszczególne komponenty w skojarzonym obiekcie reprezentującym adres URL. Trzeba jednak pamiętać, że interfejsy URLUtils oraz URLUtilsReadOnly nie mają swojego obiektowego odpowiednika, dlatego będą implementowane przez inne interfejsy. Należy to traktować w taki sposób, jakby cała terminologia (włącznie z poleceniami) tych interfejsów była definiowana bezpośrednio dla implementującego je interfejsu.

W przypadku interfejsu URL, który implementuj interfejs URLUtils, całość można wyrazić następująco:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
// Obiekt implementujący interfejs URL
{

	"domainToASCII": ...,	// metoda statyczna
	"domainToUnicode": ...,	// metoda statyczna

	// Poniższe pochodzą z URLUtils

	"input": ..., 			// skojarzenie
	"query encoding": ..., 	// skojarzenie
	"query object": ..., 	// skojarzenie (obiekt URLSearchParams)
	"url": ...,				// skojarzenie (obiekt URL)

	"href": ...,			// właściwość (get/set)
	"username": ...,		// właściwość (get/set)
	"password": ...,		// właściwość (get/set)
	"host": ...,			// właściwość (get/set)
	"hostname": ...,		// właściwość (get/set)
	"port": ...,			// właściwość (get/set)
	"pathname": ...,		// właściwość (get/set)
	"search": ...,			// właściwość (get/set)
	"searchParams": ...,	// właściwość (get/set)
	"hash": ...,			// właściwość (get/set)
	"origin": ...			// właściwość (get)

}

Dla interfejsu Location z HTML5, który także implementuj interfejs URLUtils, można zapisać:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
// Obiekt implementujący interfejs Location
{

	"assign": ...,			// metoda
	"replace": ...,			// metoda
	"reload": ...,			// metoda

	// Poniższe pochodzą z URLUtils

	"input": ..., 			// skojarzenie
	"query encoding": ..., 	// skojarzenie
	"query object": ..., 	// skojarzenie (obiekt URLSearchParams)
	"url": ...,				// skojarzenie (obiekt URL)

	"href": ...,			// właściwość (get/set)
	"username": ...,		// właściwość (get/set)
	"password": ...,		// właściwość (get/set)
	"host": ...,			// właściwość (get/set)
	"hostname": ...,		// właściwość (get/set)
	"port": ...,			// właściwość (get/set)
	"pathname": ...,		// właściwość (get/set)
	"search": ...,			// właściwość (get/set)
	"searchParams": ...,	// właściwość (get/set)
	"hash": ...,			// właściwość (get/set)
	"origin": ...			// właściwość (get)

}

Dzięki takiemu podejściu można w prosty sposób tworzyć nowe interfejsy, które definiują kolejne przydatne polecenia dla adresów URL (jak w przypadku interfejsu URL), ale z zachowaniem kompatybilności ze starszymi rozwiązaniami (jak w przypadku interfejsu Location).

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Podstawy (H1) Adresy URL (H2) Cele wyznaczone przez specyfikację (H3) Obsługa przez przeglądarki internetowe (H3) Wprowadzenie (H3)