Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

cURL cz. 1: Podstawy i protokół HTTP

Nagłówki HTTP

Jak wiadomo, odpowiedź serwera składa się nie tylko z danych, które wyświetla nam przeglądarka. W komunikacji klient <-> serwer używane są nagłówki, które służą do przesyłania informacji związanych z połączeniem, przeglądarką czy komunikacją pomiędzy obiema stronami.

Nagłówki odpowiedzi

Korzystając z rozszerzenia cURL możemy w bardzo prosty sposób wyświelić nagłówki wysyłane przez serwer. Oto kolejna wersja naszego skryptu:

<?php
$ch = curl_init('http://localhost/curl/site.php');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_exec($ch);
curl_close($ch);
?>

Pojawiły się dwie nowe opcje: CURLOPT_HEADER, która przyjmuje wartość 1 lub 0 i jest odpowiedzialna za wyświetlanie nagłówków wysyłanych przez serwer. CURLOPT_NOBODY usuwa ciało odpowiedzi, dzięki czemu otrzymujemy same nagłówki.

Oczywiście różne serwery odpowiadają inaczej, więc otrzymany wynik może się różnić. Powyższe informacje to kolejno: wersja protokołu, kod oraz opis odpowiedzi, data, wizytówka serwera, ciastko oraz typ i kodowanie dokumentu. Większość z tych wartości możemy modyfikować z wnętrza wywoływanego skryptu.

Nagłówki żądania

W pierwszej kolejności nagłówki wysyła żądający, czyli w tym przypadku nasz skrypt. Jak wcześniej wspomniałem, klient w nagłówkach ma przesłać najważniejsze informacje potrzebne do optymalnego transferu danych. Client URL Library udostępnia szereg opcji pomocnych przy zmianie szczegółów żądania.

Zacznijmy od zmiany sygnatury przeglądarki, której cURL domyślnie nie wysyła. Na listingu 2.4 znajduje się wartość nagłówka User-Agent wysłanego przez przeglądarkę Mozilla Firefox 1.5.0.3 spod systemu Linux z nakładką X11. Nic nie stoi na przeszkodzie, żeby podstawić te dane do naszego skryptu. Skorzystamy z właściwości CURLOPT_USERAGENT, która przyjmuje jako wartość ciąg znaków, który zostanie wysłany jako sygnatura przeglądarki. Zobaczmy jak to działa.

<?php
$ch = curl_init('http://localhost/curl/site.php');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3');
curl_exec($ch);
curl_close($ch);
?>

Serwer otrzymał identyczny nagłówek User-Agent jak przy wywołaniu strony z Firefoxa, co powinno być widoczne w treści zwróconego dokumentu.

Kolejną ważną opcją jest informacja o możliwości kompresji danych przesyłanych do klienta, za którą odpowiada stała CURLOPT_ENCODING. Warto sobie zdać sprawę, że sam nagłówek Accept-Encoding możemy przesłać ręcznie, ale nie zaleca się takiego postępowania, gdyż cURL nie zostanie poinformowany jak ma odkodować ciało odpowiedzi. Oczywiście wszystko można zdekompresować ręcznie, ale nie ma sensu się przemęczać.

<?php
$ch = curl_init('http://localhost/curl/site.php');
// gzip
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
// deflate
curl_setopt($ch, CURLOPT_ENCODING, 'deflate');
// gzip, deflate
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_exec($ch);
curl_close($ch);
?>

Przekazanie tej informacji może być pomocne dla wywoływanej strony, gdyż skompresowany kod zajmuje mniej miejsca, w związku z czym transfer mniej obciąża łącza.

Kolejnym popularnym nagłówkiem jest Referer, który informuje o stronie, z której nastąpiło przekierowanie do URI obecnego żądania. Przesyłamy go ustawiając odpowiednią wartość opcji CURLOPT_REFERER.

<?php
$ch = curl_init('http://localhost/curl/site.php');
curl_setopt($ch, CURLOPT_REFERER, 'http://localhost/curl/referer.php');
curl_exec($ch);
curl_close($ch);
?>

Nic nie stoi na przeszkodzie, aby przekazać w żądaniu inne nagłówki, takie jak na przykład Accept-Charset czy Accept-Language. W tym przypadku jednak nie ma już specjalnych właściwości, musimy posłużyć się bardziej ogólnym sposobem. Opcja CURLOPT_HTTPHEADER przyjmuje jako argument tablicę z listą pól do przesłania. Oto jak będzie wyglądał nasz skrypt:

<?php
$ch = curl_init('http://localhost/curl/site.php');
$headers = array('Accept-Language: pl,en-us;q=0.7,en;q=0.3',
                 'Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_exec($ch);
curl_close($ch);
?>

W tym momencie jesteśmy w stanie zrobić wszystko z nagłówkami, które otrzymuje serwer. Jako ćwiczenie pozostawiam napisanie skryptu, który spowoduje identyczny efekt wywołania strony z listingu 2.1 jak dowolna przeglądarka internetowa.

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (10)
dlaczego
Wtorek 27 Styczeń 2009 2:02:34 pm - yaotzin <yaotzin1_at_o2.pl>

dlaczego znowu nie można wydrukować sobie tego artykułu ??

pobieranie nagłówków
Środa 13 Luty 2008 10:10:17 am - jarmiar <jarek21-1992_at_tlen.pl>

jak można pobrać nagłówki wysyłane przez serwer, do którego chcemy się połączyć i zapisać je w tablicy lub w jakiejś zmiennej

ciastka w zminnych
Piątek 02 Listopad 2007 3:49:11 am - Gacek89 <czupa_at_vp.pl>

witam,
na poczatek chiał bym pogratulowaćdobrego artyku, jak narazie njlepszy jaki w seci znalazłem o curl

chciałbym sie dowedzieć jak mozna zapisać cookies do zmiennej i puźniej z niej odczytać je

Kasowanie ciastek
Wtorek 06 Marzec 2007 1:20:50 am - gustawgustaw <gustawsolski_at_gmail.com>

A jak wykasować automatycznie ciastka po zakończeniu sesji curl?

Nawiasy klamrowe.
Czwartek 08 Luty 2007 9:04:27 pm - Ludvik

Słuszna uwaga. Poprawiłem to. Wielkie dzięki za wskazanie błędu. Dziwne, że u mnie nie wywalało nic.

Re: problem
Piątek 17 Listopad 2006 3:49:05 pm - pako1979

przelicz nawiasy klamrowe w funkcji showAll , brakuje jednego zamykajcego, jak dodasz powinno zadzaialac

Re...
Poniedziałek 06 Listopad 2006 1:29:51 pm - Ludvik

Nie mam jak tego sprawdzić teraz dokładnie, ale w drugim skrypcie prawdopodobnie zamiast URL wpisałeś nazwę samego pliku.

Sprawdzałem skrypty wcześniej i dziwię się, że coś takiego wyskakuje... Jeszcze raz bym rzucił na to okiem, ale nie mam jak, niestety...

problem
Środa 25 Październik 2006 8:05:17 pm - teo <morfeusz215_at_wp.pl>

Witam mam pewien problem : skopiowałem przykładowa stronke - "site.php" jednak gdy ją włańczam manualnie wyskakuje bład :

Parse error: syntax error, unexpected $end in .........../site.php on line 20

lub poprzez L.2.2 wtedy nic sie nie dzieje a gdy przez 3.1 , został wygenerowany nastepujacy bład :

Błąd #6: Couldn't resolve host 'site.php'

Re: bezpieczeństwo
Piątek 18 Sierpień 2006 10:15:35 am - Ludvik

Wszystkie informacje o transferze są zwracane przez metodę curl_getinfo, tak jak jest napisane w 3. części. Nie chciałem zamieszczać spisu stałych, gdyż wszystkie znajdują się manualu.

http://pl.php.net/curl_getinfo

bepieczeństwo
Czwartek 17 Sierpień 2006 11:20:52 pm - takeshin

wszystko pięknie i fajnie,
ale jak to wygląda od strony bezpieczeństwa?

jak sprawdzić, jaki dokument pobieram i ile zajmuje?
co w przypadku jeśli przy wykonaniu:
$ch = curl_init('http://localhost/curl/site.php');
okaże się, że to wcale nie jest plik typu,
którego chciałbym (xml, html) a na przykład 700 avi?

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2022 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System