środa, 20 maja 2015

[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]
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! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji