ś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:

  1. $post['nazwa_pola1'] = 'wartość pola1';
  2.  
  3. $post['nazwa_pola2'] = 'wartość pola2';
  4.  
  5. $post['nazwa_pola3'] = 'wartość pola3';
  6.  
  7. [...]

Po przygotowaniu tablicy dołączamy ją do naszego żądania za pomocą opcji CURLOPT_POSTFIELDS:

  1. curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

Nasz kod wyglądać więc będzie tak:

  1. <?php
  2.  
  3. // do tej tablicy odbierzemy nagłówki
  4.  
  5. $return_headers = [];
  6.  
  7. $errors = '';
  8.  
  9.  
  10.  
  11. // funkcja odbierająca nagłówki
  12.  
  13. function headerLine($curl, $header_line ) {
  14.  
  15.     $GLOBALS['return_headers'][] = $header_line;
  16.  
  17.     return strlen($header_line);
  18.  
  19. }
  20.  
  21.  
  22.  
  23. // url do server.php
  24.  
  25. $url_to_server = 'http://localhost/server.php';
  26.  
  27.  
  28.  
  29. // tworzymy tablicę z polami POST:
  30.  
  31. $post['post_field1'] ='aaaaaaa';
  32.  
  33. $post['post_field2'] ='bbbbbbb';
  34.  
  35. $post['post_field3'] ='ccccccc';
  36.  
  37.  
  38.  
  39. // inicjujemy sesję połączenia
  40.  
  41. $ch = curl_init($url_to_server);
  42.  
  43.  
  44.  
  45. // ustawiamy opcje
  46.  
  47. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
  48.  
  49. curl_setopt($ch, CURLOPT_USERAGENT, 'fake browser'); // ustawiamy user-agenta
  50.  
  51. curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com'); // ustawiamy referera
  52.  
  53. curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka
  54.  
  55.  
  56.  
  57. curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // dołączamy pola typu POST
  58.  
  59.  
  60.  
  61. // wykonujemy połączenie
  62.  
  63. $response_body = curl_exec($ch);
  64.  
  65.  
  66.  
  67. // pobieramy błąd, jeśli wystąpi
  68.  
  69. if (curl_errno($ch))  $errors.= '<h2>Error #' . curl_errno($ch) . ': ' . curl_error($ch).'</h2>';
  70.  
  71.  
  72.  
  73. // zamykamy sesję połączenia
  74.  
  75. curl_close($ch);
  76.  
  77. ?>

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:

  1. $_POST['post_field1'] ='aaaaaaa';
  2.  
  3. $_POST['post_field2'] ='bbbbbbb';
  4.  
  5. $_POST['post_field3'] ='ccccccc';
  6.  
  7. $Headers['Content-Type'] = 'multipart/form-data; boundary=...';
  8.  
  9. $_SERVER['REQUEST_METHOD'] = 'POST'

Wymuszenie metody POST - CURLOPT_POST

Istnieje ponadto opcja CURLOPT_POST, która wymusza na cURL-u wysłanie żądania metodą POST:

  1. curl_setopt($ch, CURLOPT_POST,1);

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:

  1. new CurlFileCIEŻKA/DO/PLIKU, TYP_MIME, NAZWA_PLIKU)

zrobimy to tak:

  1. $post['file'] = new CurlFile(dirname(__FILE__).'/test.txt', 'text/plain', 'test.txt');

Musimy tutaj pamiętać, aby typ MIME odpowiadał typowi naszego pliku.

Całość kodu wyglądać więc będzie tak:

  1. <?php
  2.  
  3. // do tej tablicy odbierzemy nagłówki
  4.  
  5. $return_headers = [];
  6.  
  7. $errors = '';
  8.  
  9.  
  10.  
  11. // funkcja odbierająca nagłówki
  12.  
  13. function headerLine($curl, $header_line ) {
  14.  
  15.     $GLOBALS['return_headers'][] = $header_line;
  16.  
  17.     return strlen($header_line);
  18.  
  19. }
  20.  
  21.  
  22.  
  23. // url do server.php
  24.  
  25. $url_to_server = 'http://localhost/server.php';
  26.  
  27.  
  28.  
  29. // tworzymy tablicę z polami POST:
  30.  
  31. $post['post_field1'] ='aaaaaaa';
  32.  
  33. $post['post_field2'] ='bbbbbbb';
  34.  
  35. $post['post_field3'] ='ccccccc';
  36.  
  37.  
  38.  
  39. // dodajemy plik do tablicy:
  40.  
  41. $post['file'] = new CurlFile(dirname(__FILE__).'/test.txt', 'text/plain', 'test.txt');
  42.  
  43.  
  44.  
  45. // inicjujemy sesję połączenia
  46.  
  47. $ch = curl_init($url_to_server);
  48.  
  49.  
  50.  
  51. // ustawiamy opcje
  52.  
  53. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
  54.  
  55. curl_setopt($ch, CURLOPT_USERAGENT, 'fake browser'); // ustawiamy user-agenta
  56.  
  57. curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com'); // ustawiamy referera
  58.  
  59. curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka
  60.  
  61.  
  62.  
  63. curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // dołączamy pola typu POST
  64.  
  65.  
  66.  
  67. // wykonujemy połączenie
  68.  
  69. $response_body = curl_exec($ch);
  70.  
  71.  
  72.  
  73. // pobieramy błąd, jeśli wystąpi
  74.  
  75. if (curl_errno($ch))  $errors.= '<h2>Error #' . curl_errno($ch) . ': ' . curl_error($ch).'</h2>';
  76.  
  77.  
  78.  
  79. // zamykamy sesję połączenia
  80.  
  81. curl_close($ch);
  82.  
  83. ?>

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:

  1. $post['file'] = '@/ścieżka/do/pliku';

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:

  1. if(is_uploaded_file($_FILES['file']['tmp_name']))
  2.  
  3. {
  4.  
  5.     move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']);
  6.  
  7. }



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