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]
Nasz kod wyglądać więc będzie tak:
[code]<?php
// do tej tablicy odbierzemy nagłówki
$return_headers = [];
$errors = '';
// funkcja odbierająca nagłówki
function headerLine($curl, $header_line ) {
$GLOBALS['return_headers'][] = $header_line;
return strlen($header_line);
}
// url do server.php
$url_to_server = 'http://localhost/server.php';
// tworzymy tablicę z polami POST:
$post['post_field1'] ='aaaaaaa';
$post['post_field2'] ='bbbbbbb';
$post['post_field3'] ='ccccccc';
// inicjujemy sesję połączenia
$ch = curl_init($url_to_server);
// ustawiamy opcje
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
curl_setopt($ch, CURLOPT_USERAGENT, 'fake browser'); // ustawiamy user-agenta
curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com'); // ustawiamy referera
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // dołączamy pola typu POST
// wykonujemy połączenie
$response_body = curl_exec($ch);
// pobieramy błąd, jeśli wystąpi
if (curl_errno($ch)) $errors.= '<h2>Error #' . curl_errno($ch) . ': ' . curl_error($ch).'</h2>';
// zamykamy sesję połączenia
curl_close($ch);
?>[/code]
To wszystko, wysłaliśmy żądanie POST, zobaczmy teraz co zwróci nam nasz plik server.php:
Jak widać, żądanie zostało odebrane jako żądanie POST, a zmienne przybrały następujące wartości:
[code]$_POST['post_field1'] ='aaaaaaa';
$_POST['post_field2'] ='bbbbbbb';
$_POST['post_field3'] ='ccccccc';
$Headers['Content-Type'] = 'multipart/form-data; boundary=...';
$_SERVER['REQUEST_METHOD'] = 'POST'[/code]
Wymuszenie metody POST - CURLOPT_POST
Istnieje ponadto opcja CURLOPT_POST, która wymusza na cURL-u wysłanie żądania metodą POST:[code]curl_setopt($ch, CURLOPT_POST,1);[/code]
Warto jednak wiedzieć, że o ile wcześniej ustawiliśmy w opcjach pola typu POST za pomocą opcji CURLOPT_POSTFIELDS to ustawienie opcji CURLOPT_POST nie jest już wymagane.
Wysyłanie pliku - CurlFile()
Wysyłać dane metodą POST już umiemy, pora na przesłanie pliku tą metodą.Plik (lub pliki) dołączamy jako kolejne pola naszej tablicy z polami POST.
Stwórzmy sobie w folderze z naszymi plikami server.php i client.php kolejny plik o nazwie test.txt.
Plik ten dołączymy do naszych pól za pomocą utworzenia nowego obiektu klasy CurlFile:
[code]new CurlFile(ŚCIEŻKA/DO/PLIKU, TYP_MIME, NAZWA_PLIKU)[/code]
zrobimy to tak:
[code]$post['file'] = new CurlFile(dirname(__FILE__).'/test.txt', 'text/plain', 'test.txt');[/code]
Musimy tutaj pamiętać, aby typ MIME odpowiadał typowi naszego pliku.
Całość kodu wyglądać więc będzie tak:
[code]<?php
// do tej tablicy odbierzemy nagłówki
$return_headers = [];
$errors = '';
// funkcja odbierająca nagłówki
function headerLine($curl, $header_line ) {
$GLOBALS['return_headers'][] = $header_line;
return strlen($header_line);
}
// url do server.php
$url_to_server = 'http://localhost/server.php';
// tworzymy tablicę z polami POST:
$post['post_field1'] ='aaaaaaa';
$post['post_field2'] ='bbbbbbb';
$post['post_field3'] ='ccccccc';
// dodajemy plik do tablicy:
$post['file'] = new CurlFile(dirname(__FILE__).'/test.txt', 'text/plain', 'test.txt');
// inicjujemy sesję połączenia
$ch = curl_init($url_to_server);
// ustawiamy opcje
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
curl_setopt($ch, CURLOPT_USERAGENT, 'fake browser'); // ustawiamy user-agenta
curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com'); // ustawiamy referera
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // dołączamy pola typu POST
// wykonujemy połączenie
$response_body = curl_exec($ch);
// pobieramy błąd, jeśli wystąpi
if (curl_errno($ch)) $errors.= '<h2>Error #' . curl_errno($ch) . ': ' . curl_error($ch).'</h2>';
// zamykamy sesję połączenia
curl_close($ch);
?>[/code]
To wszystko, plik został przesłany, możemy to zobaczyć w odpowiedzi z pliku server.php, gdzie pojawiła się nam tablica $_FILES z naszym przesyłanym plikiem:
Uwaga: w poprzednich wersjach cURL-a istniała możliwość dołączenia pliku na zasadzie:
[code]$post['file'] = '@/ścieżka/do/pliku';[/code]
Warto jednak wiedzieć, iż metoda ta jest przestarzała, a spróbowanie jej użycia spowoduje wyświetlenie przez PHP informacji DEPRECATED, dlatego też wszystkie pliki jakie przesyłamy, przesyłać należy poprzez obiekt CurlFile.
Odebranie pliku na serwerze - move_uploaded_file()
Odbiór pliku wysłanego przez cURL-a nie różni się niczym od odbioru uploadowanego przez formularz pliku. Tak jak w przypadku zwykłego formularza tak i tutaj odbieramy wysyłany plik za pomocą funkcji move_uploaded_file() pobierając informacje o nim z tablicy $_FILES:[code]if(is_uploaded_file($_FILES['file']['tmp_name']))
{
move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']);
}[/code]
Oficjalny, pełny manual biblioteki cURL znajduje się tutaj: http://php.net/manual/en/book.curl.php
Brak komentarzy:
Prześlij komentarz
Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)