Visit Mozilla.org

Obsługa protokołów przez aplikacje WWW

z Mozilla Developer Center, polskiego centrum programistów Mozilli.


Ten artykuł obejmuje funkcje wprowadzone w Firefoksie 3


Spis treści

[edytuj] Wprowadzenie

Często na stronach internetowych znaleźć można odnośniki do zasobów korzystających z protokołów innych niż http. Przykładem jednego z nich jest protokół mailto:

<a href="mailto:webmaster@example.com">Napisz do webmastera</a>

Twórcy witryn internetowych używają odnośników mailto:, kiedy chcą zapewnić użytkownikom wygodny sposób na wysłanie wiadomości e-mail z poziomu strony WWW. Kiedy użytkownik aktywuje odnośnik, przeglądarka zwykle uruchamia domyślny program pocztowy określony w ustawieniach systemu operacyjnego. Można to określić jako desktopowy sposób obsługi protokołów.

Aplikacje WWW również mogą zapewnić obsługę takich protokołów. Od kiedy coraz więcej rodzajów aplikacji przenoszonych jest do środowiska WWW, potrzeba takiej integracji jest coraz bardziej wyraźna. W istocie, istnieje szereg aplikacji WWW do obsługi poczty elektronicznej, które mogłyby przetwarzać odnośniki mailto.

[edytuj] Rejestracja

Ustawienie aplikacji jako mechanizmu obsługującego protokół nie jest skomplikowane. W zasadzie wystarczy, by witryna skorzystała z metody registerProtocolHandler(), by zarejestrować się w przeglądarce jako potencjalny mechanizm obsługi danego protokołu. Na przykład:

navigator.registerProtocolHandler("mailto",
                                  "https://www.example.com/?uri=%s",
                                  "Przykładowa poczta");

gdzie parametrami są:

  • protokół (uwaga, bez dwukropka - przyp. tłum.);
  • szablon adresu URL mechanizmu obsługi protokołu. Znaki "%s" zostaną zastąpione pełną zawartością atrybutu href odnośnika; tak powstały adres URL wywołany zostanie metodą GET;
  • przyjazna dla użytkownika nazwa mechanizmu obsługi protokołu

Przeglądarka wykonując tę metodę wyświetli okno, w którym użytkownik będzie mógł wyrazić zgodę na zarejestrowanie aplikacji WWW jako mechanizmu obsługi protokołu. Firefox wyświetla następujące pytanie w obszarze powiadomień:

Image:wph-notification.png

Uwaga: Dostarczony szablon URL musi znajdować się w tej samej domenie, co strona próbująca dokonać rejestracji. W przeciwnym wypadku rejestracja się nie powiedzie. Na przykład, http://example.com/homepage.html może zarejestrować mechanizm obsługi protokołu dla http://example.com/handle_mailto/%s, ale już nie dla http://example.org/handle_mailto/%s.

[edytuj] Przykład

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="pl">
<head>
  <title>Przykład rejestracji obsługi protokołów</title>
  <script type="text/javascript">
    navigator.registerProtocolHandler("fikcyjny", "http://starkravingfinkle.org/projects/wph/handler.php?value=%s", "Fikcyjny protokół");
  </script>
</head>
<body>
  <h1>Przykład rejestracji obsługi protokołów</h1>
  <p>Strona ta zainstaluje mechanizm obsługi protokołów dla protokołu <code>fikcyjny:</code>.</p> 
</body>
</html>

[edytuj] Aktywacja

Od tej pory kiedykolwiek użytkownik aktywuje odnośnik do zasobu o zarejestrowanym protokole, przeglądarka przekieruje żądanie do adresu URL dostarczonego podczas rejestracji. Firefox domyślnie poprosi uprzednio użytkownika o potwierdzenie tej czynności.

Image:wph-launch.png

[edytuj] Przykład

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="pl">
<head>
  <title>Test obsługi protokołów</title>
</head>
<body>
  <p>Widzieliście już kiedyś <a href="fikcyjny:to%20nie%20istnieje">coś takiego</a>?</p>
</body>
</html>

[edytuj] Obsługa protokołu

Kolejnym etapem jest obsłużenie żądania. Przeglądarka pobiera atrybut href odnośnika, łączy go z szablonem adresów URL podanym podczas rejestracji mechanizmu obsługi i wysyła do serwera żądanie HTTP GET z wynikowym adresem. Dla powyższego przykładu przeglądarka wyśle żądanie GET o następującym adresie:

http://starkravingfinkle.org/projects/wph/handler.php?value=fikcyjny:to%20nie%20istnieje

Po stronie serwera można odebrać przekazany adres URL i wykonać żądane akcje.

Uwaga: Kod po stronie serwera dostanie całą zawartość atrybutu href. Oznacza to, że serwer będzie musiał podczas przetworzyć otrzymany adres URL i oddzielić protokół od danych.

[edytuj] Przykład

<?php
$value = "";
if ( isset ( $_GET["value"] ) ) {
  $value = $_GET["value"];
}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="pl">
<head>
    <title>Obsługa protokołów - przykład</title>
</head>
<body>
  <h1>Obsługa protokołów - przykład</h1>
  <p>Strona ta otwierana jest po aktywowaniu odnośnika do zasobu o protokole <code>fikcyjny:</code>. Otrzymane dane:</p>
  <textarea>
<?php echo(urldecode($value)) ?>
  </textarea>
</body>
</html>