Pokazywanie postów oznaczonych etykietą cURL. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą cURL. Pokaż wszystkie posty

czwartek, 21 maja 2015

[PHP][cURL] Podstawy cz.5 - obsługa przekierowań

TRUE
4123571317394950562
Bardzo często odwołując się do danego zasobu zostajemy przekierowani w inne miejsce często nawet tego nie zauważając. W przypadku takim wysyłany jest przez serwer kod statusu z klasy 3xx, mówiący o typie danego przekierowania. Przekierowania takie często tworzymy sami, wywołując pehapową funkcję header("Location: /przekierowanie/do/")

Przekierowanie to zwraca zwraca do klienta kod statusu 302 Found, zamiast 200 OK. Kod 200 OK wysyłany jest dopiero po nastąpieniu przekierowania do wywoływanego w Location: pliku.  Biblioteka cURL domyślnie nie podąża za takimi przekierowaniami, a odbiera jedynie nagłówek informujący o istnieniu przekierowania. Aby zmienić zachowanie cURL-a i nakazać mu podążanie za takimi przekierowaniami, musimy ustawić następującą opcję:
[code]curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);[/code]
Przetestujmy to na przykładzie. Najpierw z nieustawionym podążaniem za przekierowaniem, a potem z ustawionym. W folderze na serwerze, gdzie trzymamy nasze przygotowane w części pierwszej pliki client.php i server.php stwórzmy jeszcze jeden plik o nazwie:
[code]redirected.php[/code]

środa, 20 maja 2015

[PHP][cURL] Podstawy cz.4 - cookies

TRUE
8097816399849509347
Wysyłanie cookies może odbywać się dwukierunkowo, tj. serwer może w odpowiedzi zażądać utworzenia pliku ciasteczka w przeglądarce, jak i przeglądarka/cURL może wysłać do serwera informacje o ciasteczkach jakie są ustawione dla danej domeny. Ciasteczka oczywiście możemy preparować sami, a odbywa się to za pomocą stworzenia prostego ciągu z nazwami i wartościami naszych ciasteczek, a nastepnie wysłaniu żądania na serwer. Spójrzmy więc jak to wygląda w praktyce.

Przygotowanie ciasteczek - CURLOPT_COOKIE

W najprostrzej możliwej postaci musimy przygotować ciąg o następującej strukturze:
[code]$cookies = "cookie1=".urlencode("wartość1")."; cookie2=".urlencode("wartość2");  // i tak dalej[/code]
Wszystkie ciastecznka muszą być rozdzielone średnikiem, a ich wartości potraktowane funkcją urlencode().

Nastepnie taki ciąg ustawiamy jako opcję w cURL-u za pomocą parametru CURLOPT_COOKIE:
[code]curl_setopt($ch, CURLOPT_COOKIE, $cookies);[/code]
Całość wysyłamy na serwer.

[PHP][cURL] Podstawy cz.3 - żądania POST i wysyłanie plików

TRUE
484552077121779142
Wysyłanie żądań metodą POST nie jest trudne. Sprowadza się to do przygotowania jednej tablicy oraz ustawienia odpowiedniej opcji za pomocą funkcji curl_setopt(). Dzięki możliwości wysyłania żądań POST możemy za pomocą cURL-a zasymulować akcję przesłania formularza. Dodatkowo - dzięki metodzie POST możemy również wysyłać na serwer pliki. Jest to również bardzo prosta procedura, przyjrzyjmy się więc jak to działa w praktyce.

Przygotowanie żądania POST - CURLOPT_POSTFIELDS

Na początku musimy przygotować tablicę, w której umieścimy wszystkie pola, które mają być przez cURL-a wysłane jako zmienne typu $_POST. Tablica taka wyglądać będzie tak:
[code]
$post['nazwa_pola1'] = 'wartość pola1';
$post['nazwa_pola2'] = 'wartość pola2';
$post['nazwa_pola3'] = 'wartość pola3';
[...][/code]
Po przygotowaniu tablicy dołączamy ją do naszego żądania za pomocą opcji CURLOPT_POSTFIELDS:
[code]curl_setopt($ch, CURLOPT_POSTFIELDS, $post);[/code]

[PHP][cURL] Podstawy cz.2 - nagłówki HTTP i pierwsze połączenie poprzez cURL

TRUE
1141251523631684398
Aby dobrze zrozumieć jak wygląda połączenie "od środka" przygotowaliśmy w poprzednim artykule dwa pliki - server.php i client.php. W tym tekście omówimy zasadę ich działania oraz ogólną procedurę połączenia po protokole HTTP. Jest to ważne, aby to dokładnie zrozumieć, gdyż bez znajomości tej podstawowej sprawy dalsza zabawa z cURL-em byłaby bezcelowa. Oczywiście bylibyśmy w stanie wykonać połączenie i je wykorzystać, ale byłaby to wiedza "na sucho". Zrozumienie działania "od podstaw" pozwoli nam na o wiele głębszą zabawę z biblioteką cURL.

Jak wygląda komunikacja z serwerem?

Wchodząc na daną stronę internetową poprzez protokół HTTP, przeglądarka wysyła na serwer, który udostępnia stronę nagłówek (header) z żądaniem dotyczący pobrania jej zawartości. W nagłówku tym przeglądarka wysyła serwerowi kilka informacji o sobie, podaje np. swoją nazwę, swoją wersję, czy też wartość plików cookie, które mamy zapisane dla danej strony. Wszystkie te informacje wysyłane są na serwer w nagłówku. Serwer następnie otrzymuje taki nagłówek i wedle życzenia odpowiada na niego. Odpowiedź taka może być różna. Jeśli strona, o którą prosimy istnieje na serwerze, w odpowiedzi serwer wysyła tym razem swój nagłówek z kodem odpowiedzi, w tym przypadku 200 OK, oznaczający, że strona została odnaleziona.

Wraz z nagłówkiem zwracana jest też do przeglądarki treść strony (body). Jeśli jednak strona nie zostanie odnaleziona, serwer może odesłać nam kod np. 404 Not Found, oznaczający, że zasób, do którego się odwołujemy nie istnieje. Możemy też dostać odpowiedź z kodem z zakresu 3xx, które to kody informują o przekierowaniach i zmianie adresu danej strony. Wszystkie te informacje przesyłane są w nagłówkach pomiędzy stroną (serwerem), a przeglądarką (klientem) na zasadzie:

 1. żądanie (request) >> 
 2. << odpowiedź (response)

Obrazuje to ta grafika:
źródło: https://cdn.tutsplus.com/net/uploads/legacy/511_http/http_diagram.png

Wiemy już zatem, że komunikacja taka odbywa się w obie strony za pomocą nagłówków HTTP.
Co jednak dokładnie zawierają w sobie takie nagłówki? Pierwszą i najważniejszą rzeczą jest kod odpowiedzi HTTP. Kod taki jest przesyłany na pierwszym miejscu nagłówka, a jego wartość informuje przeglądarkę o statusie żądania.
Kody te dzielą się na 5 kategorii:

  • kody 1xx (np. 110 Connection Timed Out) - są to kody informacyjne
  • kody 2xx (np. 200 OK) - są to kody powodzenia
  • kody 3xx (np. 301 Moved Permamently) - informują o przekierowaniach
  • kody 4xx (np. 404 Not Found) - są kodami błędu po stronie klienta
  • kody 5xx (np. 502 Bad Gateway) - są to wewnętrzne błędy serwera

Pełną listę kodów znaleźć można np. tutaj:
http://pl.wikipedia.org/wiki/Kod_odpowiedzi_HTTP

Poza kodem odpowiedzi w nagłówkach przesyłane są oczywiście dodatkowe dane.
Przykładowe nagłówki otrzymane w odpowiedzi od serwera wyglądać mogą np. tak:
[code]
HTTP/1.1 200 OK
Date: Wed, 20 May 2015 17:19:37 GMT
Server: Apache/2.4.9 (Win64) PHP/5.5.12
Set-Cookie: PHPSESSID=ap0a54qaoafbarksjj48i279n1; path=/
Content-Length: 4174
Content-Type: text/html
[/code]

[PHP][cURL] Podstawy cz.1 - przygotujmy sobie środowisko testowe

TRUE
8689737018389349288
Biblioteka cURL to bardzo potężne narzędzie, które można wykorzystać do wykonania praktycznie każdego połaczenia. Aby dobrze ją zrozumieć trzeba wiedzieć co tak naprawdę się dzieje w momencie połączenia, jakie nagłówki są przesyłane, w jaki sposób i jakie dane w wyniku tego są zwracane. Stworzymy sobie zatem do tego na localhoście coś w rodzaju środowiska testowego składającego się z dwóch plików - jednego imitującego serwer, drugiego - imitującego klienta, który się z nim łączy. Do tego celu przygotowałem dwa pliki: server.php, oraz client.php. Oba pliki wrzucimy na localhosta. Omówię je za chwilę, na razie je stwórzmy.

Po stronie serwerowej - server.php

Pierwszy z plików będzie udawał stronę na serwerze.
Przeklejmy poniższy kod i zapiszmy plik jako server.php:
[code]<?php
/**
 * server.php - PHP Script for testing cURL connections.
 * @version 1.1
 * @author Marcin Szczygliński <szczyglis83@gmail.com>
 * @link http://phpmajster.blogspot.com/search/label/cURL
 * @package cURL Tester
 */
session_start();
function showVariables($aVars) {
    if (count($aVars) == 0) {
        echo "  ---";
    } else {
        foreach ($aVars as $name => $value) {
          if(!is_array($value))
          {
            echo "<p><u>".$name."</u> = ".str_replace(";", "; ", $value)."</p>";
          } else {
            var_dump($value);
          }
        }
    }
}
// Get referer
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '[NULL]';
?><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>server.php</title><style>
body,td,th { font-family: Consolas, Arial, Verdana, Geneva, sans-serif; font-size: 11px; color: #000; background-color: #fff; }
h1 { background-color: #5f82ba; color: #fff; }
a { color:#5f82ba; text-decoration:none; }
p { margin: 5px; border-bottom:1px dotted #b7b9bb;}
u { text-decoration:none; font-weight:bold; background-color: #5f82ba; padding:1px; color: #fff;
padding-left:4px; padding-right:4px; border: 1px solid #fff; }
table { border-spacing:0px; border: 0px; padding:0; width:100%}
td { padding:10px; border: 1px solid #000;}
.t1 { vertical-align:top; font-weight: bold; font-size: 14px; background-color: #5f82ba; color: #fff;}
</style></head>
<body>
<h1>http://<?php echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ?></h1>
  <b>Request from <?php echo $referer; ?>:</b>
  <table><tr><td class='t1'>$_GET</td><td><?php showVariables($_GET); ?></td></tr>
    <tr><td class='t1'>$_POST</td><td><?php showVariables($_POST); ?></td></tr>
    <tr><td class='t1'>$_FILES</td><td><?php showVariables($_FILES); ?></td></tr>
    <tr><td class='t1'>$_COOKIE</td><td><?php showVariables($_COOKIE); ?></td></tr>
    <tr><td class='t1'>Headers</td><td><?php showVariables(getallheaders()); ?></td></tr>
    <tr><td class='t1'>$_SESSION</td><td><?php showVariables($_SESSION); ?></td></tr>
    <tr><td class='t1'>$_REQUEST</td><td><?php showVariables($_REQUEST); ?></td></tr>
    <tr><td class='t1'>$_SERVER</td><td><?php showVariables($_SERVER); ?></td></tr>
    <tr><td class='t1'>$_ENV</td><td><?php showVariables($_ENV); ?></td></tr>
    </table>
</body></html>[/code]
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji