List of commonly used cases with PHP cURL extension.
CURL library Home Page and Wiki Page.
PHP Extension Page and List Of Options.
PHP Guzzle library - wrapper over PHP CURL extension.
For testing requests we will use the excellent services httpbin.org and Postman Echo.
- Requirements
- Installation
- Basics
- Advanced
- Todo
- PHP >= 5.5
- cURL PHP Extension
- Mbstring PHP Extension
- Fileinfo PHP Extension
Download repository
git clone https://github.com/andriichuk/php-curl-cookbook.git
Go to the directory
cd ./php-curl-cookbook
Install composer dependencies
bash run composer install
Run BASH example
bash run bash 01_Basics/01_Request_Methods/01_Get/console.sh
Run PHP example
bash run php 01_Basics/01_Request_Methods/01_Get/curl-ext.php
For multiple usage
bash console
bash 01_Basics/01_Request_Methods/01_Get/console.sh
php 01_Basics/01_Request_Methods/01_Get/curl-ext.php
[example]
curl --request GET "https://postman-echo.com/get?foo=bar"
[example]
The default method is GET. If you want to specify it directly than add CURLOPT_CUSTOMREQUEST
option.
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
CURLOPT_RETURNTRANSFER => true,
/**
* Or specify directly
* CURLOPT_CUSTOMREQUEST => 'GET'
*/
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo($response);
Call get
method of Guzzle Client instance.
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->get(
'https://postman-echo.com/get',
[
RequestOptions::QUERY => [
'foo' => 'bar',
],
]
);
echo($response->getBody()->getContents());
Response
{"args":{"foo":"bar"},"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","user-agent":"GuzzleHttp/6.3.3 curl/7.64.0 PHP/7.3.5-1+ubuntu19.04.1+deb.sury.org+1","x-forwarded-port":"443"},"url":"https://postman-echo.com/get?foo=bar"}
[example]
curl --request POST "https://postman-echo.com/post" --data "POST raw request content"
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/post',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify POST method
*/
CURLOPT_POST => true,
/**
* Specify request content
*/
CURLOPT_POSTFIELDS => 'POST raw request content',
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo($response);
Call post
method of Guzzle Client instance.
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->post(
'https://postman-echo.com/post',
[
RequestOptions::BODY => 'POST raw request content',
RequestOptions::HEADERS => [
'Content-Type' => 'application/x-www-form-urlencoded',
],
]
);
echo($response->getBody()->getContents());
Response
{"args":{},"data":"","files":{},"form":{"POST raw request content":""},"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","content-length":"24","content-type":"application/x-www-form-urlencoded","user-agent":"GuzzleHttp/6.3.3 curl/7.64.0 PHP/7.3.5-1+ubuntu19.04.1+deb.sury.org+1","x-forwarded-port":"443"},"json":{"POST raw request content":""},"url":"https://postman-echo.com/post"}
[example]
curl --request POST "https://postman-echo.com/post" --data "foo=bar&baz=biz"
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/post',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify POST method
*/
CURLOPT_POST => true,
/**
* Specify array of form fields
*/
CURLOPT_POSTFIELDS => [
'foo' => 'bar',
'baz' => 'biz',
],
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo($response);
Call post
method of Guzzle Client instance.
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->post(
'https://postman-echo.com/post',
[
RequestOptions::FORM_PARAMS => [
'foo' => 'bar',
'baz' => 'biz',
],
]
);
echo($response->getBody()->getContents());
Response
{"args":{},"data":"","files":{},"form":{"foo":"bar","baz":"biz"},"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","content-length":"15","content-type":"application/x-www-form-urlencoded","user-agent":"GuzzleHttp/6.3.3 curl/7.64.0 PHP/7.3.5-1+ubuntu19.04.1+deb.sury.org+1","x-forwarded-port":"443"},"json":{"foo":"bar","baz":"biz"},"url":"https://postman-echo.com/post"}
[example]
curl --request PUT "https://postman-echo.com/put" --data "foo=bar&baz=biz"
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/put',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify custom HTTP request method
*/
CURLOPT_CUSTOMREQUEST => 'PUT',
/**
* Specify request body (can be array or string)
*/
CURLOPT_POSTFIELDS => [
'foo' => 'bar',
'baz' => 'biz',
]
]);
$pageContent = curl_exec($curlHandler);
curl_close($curlHandler);
echo($pageContent);
Call put
method of Guzzle Client instance.
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->put(
'https://postman-echo.com/put',
[
RequestOptions::FORM_PARAMS => [
'foo' => 'bar',
'baz' => 'biz',
],
]
);
echo($response->getBody()->getContents());
Response
{"args":{},"data":"","files":{},"form":{"foo":"bar","baz":"biz"},"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","content-length":"15","content-type":"application/x-www-form-urlencoded","user-agent":"GuzzleHttp/6.3.3 curl/7.64.0 PHP/7.3.5-1+ubuntu19.04.1+deb.sury.org+1","x-forwarded-port":"443"},"json":{"foo":"bar","baz":"biz"},"url":"https://postman-echo.com/put"}
curl --request PATCH "https://postman-echo.com/patch" --data "foo=bar&baz=biz"
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/patch',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify custom HTTP request method
*/
CURLOPT_CUSTOMREQUEST => 'PATCH',
/**
* Specify request body (can be array or string)
*/
CURLOPT_POSTFIELDS => [
'foo' => 'bar',
'baz' => 'biz',
]
]);
$pageContent = curl_exec($curlHandler);
curl_close($curlHandler);
echo($pageContent);
Call patch
method of Guzzle Client instance.
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->patch(
'https://postman-echo.com/patch',
[
RequestOptions::FORM_PARAMS => [
'foo' => 'bar',
'baz' => 'biz',
],
]
);
echo($response->getBody()->getContents());
Response
{"args":{},"data":"","files":{},"form":{"foo":"bar","baz":"biz"},"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","content-length":"15","accept":"*/*","content-type":"application/x-www-form-urlencoded","user-agent":"curl/7.64.0","x-forwarded-port":"443"},"json":{"foo":"bar","baz":"biz"},"url":"https://postman-echo.com/patch"}
curl --request DELETE "https://postman-echo.com/delete" --data "foo=bar&baz=biz" --max-time 10
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/delete',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify custom HTTP request method
*/
CURLOPT_CUSTOMREQUEST => 'DELETE',
/**
* Specify request body (can be array or string)
*/
CURLOPT_POSTFIELDS => [
'foo' => 'bar',
'baz' => 'biz',
]
]);
$pageContent = curl_exec($curlHandler);
curl_close($curlHandler);
echo($pageContent);
Call delete
method of Guzzle Client instance.
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->delete(
'https://postman-echo.com/delete',
[
RequestOptions::FORM_PARAMS => [
'foo' => 'bar',
'baz' => 'biz',
],
]
);
echo($response->getBody()->getContents());
Response
{"args":{},"data":"","files":{},"form":{"foo":"bar","baz":"biz"},"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","content-length":"15","content-type":"application/x-www-form-urlencoded","user-agent":"GuzzleHttp/6.3.3 curl/7.64.0 PHP/7.3.5-1+ubuntu19.04.1+deb.sury.org+1","x-forwarded-port":"443"},"json":{"foo":"bar","baz":"biz"},"url":"https://postman-echo.com/delete"}
curl --request GET "https://postman-echo.com/headers" --header "foo: bar" --header "baz: biz"
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/headers',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify request headers
*/
CURLOPT_HTTPHEADER => [
'foo: bar',
'baz: biz',
]
]);
$pageContent = curl_exec($curlHandler);
curl_close($curlHandler);
echo($pageContent);
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->get(
'https://postman-echo.com/headers',
[
RequestOptions::HEADERS => [
'foo' => 'bar',
'baz' => 'biz',
],
]
);
print_r(
$response->getBody()->getContents()
);
Response
{"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","baz":"biz","foo":"bar","user-agent":"GuzzleHttp/6.3.3 curl/7.64.0 PHP/7.3.5-1+ubuntu19.04.1+deb.sury.org+1","x-forwarded-port":"443"}}
curl --request GET "https://postman-echo.com/response-headers?Content-Type=text/html&foo=bar"
$headers = [];
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/response-headers?foo=bar',
/**
* Exclude the body from the output
*/
CURLOPT_NOBODY => true,
CURLOPT_RETURNTRANSFER => false,
/**
* Include the header in the output
*/
CURLOPT_HEADER => false,
/**
* Collect server response headers
*/
CURLOPT_HEADERFUNCTION => function ($curlInfo, $header) use (&$headers) {
array_push($headers, trim($header));
return mb_strlen($header);
},
]);
curl_exec($curlHandler);
curl_close($curlHandler);
print_r(
array_filter($headers)
);
use GuzzleHttp\Client;
$httpClient = new Client();
$response = $httpClient->get('https://postman-echo.com/response-headers?foo=bar');
print_r(
$response->getHeaders()
);
Response
Array
(
[Content-Type] => Array
(
[0] => application/json; charset=utf-8
)
[Date] => Array
(
[0] => Sun, 19 May 2019 14:16:36 GMT
)
// ...
See full list of options here
curl --request GET "https://postman-echo.com/get?foo=bar" -w "size_download: %{size_download}" -o /dev/null -s
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
CURLOPT_RETURNTRANSFER => true,
]);
curl_exec($curlHandler);
$curlInfo = curl_getinfo($curlHandler);
curl_close($curlHandler);
print_r($curlInfo);
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use GuzzleHttp\TransferStats;
$httpClient = new Client();
$httpClient->get(
'https://postman-echo.com/get',
[
RequestOptions::ON_STATS => function (TransferStats $stats) {
print_r($stats->getHandlerStats());
}
]
);
Response
Array
(
[url] => https://postman-echo.com/get
[content_type] => application/json; charset=utf-8
[http_code] => 200
[header_size] => 354
[request_size] => 128
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
// ...
[example]
curl --verbose --request GET "https://postman-echo.com/get?foo=bar"
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify debug option
*/
CURLOPT_VERBOSE => true,
]);
curl_exec($curlHandler);
curl_close($curlHandler);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$httpClient->get(
'https://postman-echo.com/get?foo=bar',
[
RequestOptions::DEBUG => true,
]
);
Response
* Trying 35.153.115.14...
* TCP_NODELAY set
* Expire in 149999 ms for 3 (transfer 0x55b754f97120)
* Expire in 200 ms for 4 (transfer 0x55b754f97120)
* Connected to postman-echo.com (35.153.115.14) port 443 (#0)
// ...
[example]
curl --request GET "https://postman-echo.com/get?foo=bar" --verbose --silent > debug.log 2>&1
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify debug option.
*/
CURLOPT_VERBOSE => true,
/**
* Specify log file.
* Make sure that the folder is writable.
*/
CURLOPT_STDERR => fopen('./curl.log', 'w+'),
]);
curl_exec($curlHandler);
curl_close($curlHandler);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$httpClient->get(
'https://postman-echo.com/get?foo=bar',
[
RequestOptions::DEBUG => fopen('./guzzle.log', 'w+'),
]
);
* Trying 35.153.115.14...
* TCP_NODELAY set
* Expire in 149999 ms for 3 (transfer 0x55b754f97120)
* Expire in 200 ms for 4 (transfer 0x55b754f97120)
* Connected to postman-echo.com (35.153.115.14) port 443 (#0)
// ...
[example]
curl --verbose --request GET "https://httpbin.org/delay/5" --max-time 3 --connect-timeout 2
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://httpbin.org/delay/5',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_TIMEOUT => 3,
]);
$response = curl_exec($curlHandler);
$statusCode = curl_getinfo($curlHandler, CURLINFO_HTTP_CODE);
if ($statusCode > 300) {
print_r('Redirection or Error response with status: ' . $statusCode);
}
if (curl_errno($curlHandler) !== CURLE_OK) {
print_r([
'error_code' => curl_errno($curlHandler),
'error_message' => curl_error($curlHandler),
]);
}
curl_close($curlHandler);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use GuzzleHttp\Exception\GuzzleException;
$httpClient = new Client();
try {
$response = $httpClient->get(
'https://httpbin.org/dedlay/5',
[
RequestOptions::CONNECT_TIMEOUT => 2,
RequestOptions::TIMEOUT => 3,
]
);
print_r($response->getBody()->getContents());
} catch (GuzzleException $exception) {
print_r([
'code' => $exception->getCode(),
'message' => $exception->getMessage(),
]);
}
Response
Array
(
[error_code] => 28
[error_message] => Operation timed out after 3001 milliseconds with 0 bytes received
)
curl --location --max-redirs 5 -X GET "https://httpbin.org/absolute-redirect/3"
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://httpbin.org/absolute-redirect/3',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 5,
]);
$content = curl_exec($curlHandler);
$curlInfo = curl_getinfo($curlHandler);
curl_close($curlHandler);
print_r($curlInfo);
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use GuzzleHttp\TransferStats;
$httpClient = new Client();
$response = $httpClient->get(
'https://httpbin.org/absolute-redirect/3',
[
RequestOptions::ALLOW_REDIRECTS => [
'max' => 5,
],
]
);
echo $response->getStatusCode();
Response
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.0"
},
"url": "https://httpbin.org/get"
}
[example]
curl --request GET "https://httpbin.org/delay/5" --max-time 20 --connect-timeout 10
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://httpbin.org/delay/5',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 20,
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
print_r($response);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->get(
'https://httpbin.org/delay/5',
[
RequestOptions::CONNECT_TIMEOUT => 10,
RequestOptions::TIMEOUT => 20,
]
);
print_r($response->getBody()->getContents());
[example]
# See https://ec.haxx.se/http-versions.html
curl --request GET "https://httpbin.org/get" --http2
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://httpbin.org/get',
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
]);
curl_exec($curlHandler);
$info = curl_getinfo($curlHandler);
curl_close($curlHandler);
print_r($info);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use GuzzleHttp\TransferStats;
$httpClient = new Client();
$response = $httpClient->get(
'https://httpbin.org/get',
[
RequestOptions::VERSION => 2.0,
RequestOptions::ON_STATS => function (TransferStats $stats) {
print_r($stats->getHandlerStats());
}
]
);
Response
Array
(
[url] => https://httpbin.org/get
...
[http_version] => 2
[protocol] => 2
...
)
[example]
curl --version
[example]
print_r(curl_version());
Response
curl 7.64.0 (x86_64-pc-linux-gnu) libcurl/7.64.0 OpenSSL/1.1.1c zlib/1.2.11 libidn2/2.0.5 libpsl/0.20.2 (+libidn2/2.0.5) libssh/0.8.6/openssl/zlib nghttp2/1.36.0 librtmp/2.3
Release-Date: 2019-02-06
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL
[example]
curl --request GET "https://httpbin.org/get" --user-agent 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3'
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/get',
CURLOPT_USERAGENT => 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3',
/* OR set header
CURLOPT_HTTPHEADER => [
'User-Agent: Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3',
]*/
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
print_r($response);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->get(
'https://httpbin.org/get',
[
RequestOptions::HEADERS => [
'User-Agent' => 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3',
]
]
);
print_r($response->getBody()->getContents());
[example]
curl --verbose --location --request GET "https://httpbin.org/absolute-redirect/5" 2>&1 | grep "Location:"
Response
< Location: http://httpbin.org/absolute-redirect/4
< Location: http://httpbin.org/absolute-redirect/3
< Location: http://httpbin.org/absolute-redirect/2
< Location: http://httpbin.org/absolute-redirect/1
< Location: http://httpbin.org/get
[example]
$curlHandler = curl_init();
$locations = [];
curl_setopt_array(
$curlHandler,
[
CURLOPT_URL => 'https://httpbin.org/absolute-redirect/5',
CURLOPT_NOBODY => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADERFUNCTION => function ($curlInfo, $header) use (&$locations) {
preg_match('#Location:\s(?<url>[\S]+)#iu', $header, $location);
if (!empty($location['url'])) {
$locations[] = trim($location['url']);
}
return mb_strlen($header);
},
]
);
curl_exec($curlHandler);
curl_close($curlHandler);
print_r($locations);
Response
Array
(
[0] => http://httpbin.org/absolute-redirect/4
[1] => http://httpbin.org/absolute-redirect/3
[2] => http://httpbin.org/absolute-redirect/2
[3] => http://httpbin.org/absolute-redirect/1
[4] => http://httpbin.org/get
)
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use GuzzleHttp\RedirectMiddleware;
$httpClient = new Client();
$response = $httpClient->get(
'https://httpbin.org/absolute-redirect/5',
[
RequestOptions::ALLOW_REDIRECTS => [
'max' => 5,
'track_redirects' => true,
],
]
);
print_r($response->getHeader(RedirectMiddleware::HISTORY_HEADER));
Response
Array
(
[0] => http://httpbin.org/absolute-redirect/4
[1] => http://httpbin.org/absolute-redirect/3
[2] => http://httpbin.org/absolute-redirect/2
[3] => http://httpbin.org/absolute-redirect/1
[4] => http://httpbin.org/get
)
[example]
curl --request GET "https://httpbin.org/get" --referer "https://github.com"
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://httpbin.org/get',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_REFERER => 'https://github.com',
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
print_r($response);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->get(
'https://httpbin.org/get',
[
RequestOptions::HEADERS => [
'Referer' => 'https://github.com',
],
]
);
print_r($response->getBody()->getContents());
Response
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"Referer": "https://github.com",
"User-Agent": "curl/7.64.0"
},
"origin": "100.00.00.00",
"url": "https://httpbin.org/get"
}
[example]
# format: curl --form '[request_field_name]=@[absolute_path_to_file]' [upload_url]
curl --form 'file=@/home/serge/curl-examples/02_Advanced/01_Files/01_Upload/resource/file.txt' https://postman-echo.com/post
[example]
$uploadFilePath = __DIR__ . '/resource/file.txt';
if (!file_exists($uploadFilePath)) {
throw new Exception('File not found: ' . $uploadFilePath);
}
$uploadFileMimeType = mime_content_type($uploadFilePath);
$uploadFilePostKey = 'file';
$uploadFile = new CURLFile(
$uploadFilePath,
$uploadFileMimeType,
$uploadFilePostKey
);
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/post',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify POST method
*/
CURLOPT_POST => true,
/**
* Specify array of form fields
*/
CURLOPT_POSTFIELDS => [
$uploadFilePostKey => $uploadFile,
],
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo($response);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$response = $httpClient->post(
'https://postman-echo.com/post',
[
RequestOptions::MULTIPART => [
[
'name' => 'file',
'contents' => new SplFileObject(__DIR__ . '/resource/file.txt', 'r'),
'filename' => 'file',
]
],
]
);
echo($response->getBody()->getContents());
Response
{"args":{},"data":{},"files":{"file":"data:application/octet-stream;base64,TG9yZW0gaXBzdW0gZG9sb3Igc2l0I ..."}}
[example]
curl --form 'text_file=@/home/serge/curl-examples/02_Advanced/01_Files/02_Upload_Multiple/resource/file.txt' \
--form 'image_file=@/home/serge/curl-examples/02_Advanced/01_Files/02_Upload_Multiple/resource/github-icon.png' \
https://postman-echo.com/post
[example]
$localFiles = [
'text_file' => __DIR__ . '/resource/file.txt',
'image_file' => __DIR__ . '/resource/github-icon.png',
];
$uploadFiles = [];
foreach ($localFiles as $filePostKey => $uploadFilePath) {
if (!file_exists($uploadFilePath)) {
throw new Exception('File not found: ' . $uploadFilePath);
}
$uploadFileMimeType = mime_content_type($uploadFilePath);
$uploadFiles[$filePostKey] = new CURLFile($uploadFilePath, $uploadFileMimeType, $filePostKey);
}
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/post',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify POST method
*/
CURLOPT_POST => true,
/**
* Specify array of form fields
*/
CURLOPT_POSTFIELDS => $uploadFiles,
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo($response);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$localFiles = [
'text_file' => __DIR__ . '/resource/file.txt',
'image_file' => __DIR__ . '/resource/github-icon.png',
];
$uploadFiles = [];
foreach ($localFiles as $filePostKey => $uploadFilePath) {
if (!file_exists($uploadFilePath)) {
throw new Exception('File not found: ' . $uploadFilePath);
}
array_push($uploadFiles, [
'name' => $filePostKey,
'contents' => new SplFileObject($uploadFilePath, 'r'),
'filename' => $filePostKey,
]);
}
$httpClient = new Client();
$response = $httpClient->post(
'https://postman-echo.com/post',
[
RequestOptions::MULTIPART => $uploadFiles,
]
);
echo($response->getBody()->getContents());
{"args":{},"data":{},"files":{"text_file":"data:application/octet-stream;base64,TG9yZW0gaXBzdW0gZG9sb3Ig ...", "image_file":"data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUgAAANAAAADQC ..."}}
[example]
curl --form 'documents[]=@/home/serge/projects/php-curl-cookbook/02_Advanced/01_Files/03_Upload_Array_Of_Files/resource/file-1.txt' \
--form 'documents[]=@/home/serge/projects/php-curl-cookbook/02_Advanced/01_Files/03_Upload_Array_Of_Files/resource/file-2.txt' \
--form 'images[icon]=@/home/serge/projects/php-curl-cookbook/02_Advanced/01_Files/03_Upload_Array_Of_Files/resource/github-icon.png' \
--form 'images[octocat]=@/home/serge/projects/php-curl-cookbook/02_Advanced/01_Files/03_Upload_Array_Of_Files/resource/github-octocat.jpg' \
https://postman-echo.com/post
[example]
$localFiles = [
// indexed
'documents' => [
__DIR__ . '/resource/file-1.txt',
__DIR__ . '/resource/file-2.txt',
],
// associated
'images' => [
'icon' => __DIR__ . '/resource/github-icon.png',
'octocat' => __DIR__ . '/resource/github-octocat.jpg',
],
];
$uploadFiles = [];
foreach ($localFiles as $fileType => $files) {
foreach ($files as $filePostKey => $uploadFilePath) {
if (!file_exists($uploadFilePath)) {
throw new Exception('File not found: ' . $uploadFilePath);
}
$uploadFileMimeType = mime_content_type($uploadFilePath);
$keyName = sprintf('%s[%s]', $fileType, $filePostKey);
$uploadFiles[$keyName] = new CURLFile($uploadFilePath, $uploadFileMimeType, $filePostKey);
}
}
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/post',
CURLOPT_RETURNTRANSFER => true,
/**
* Specify POST method
*/
CURLOPT_POST => true,
/**
* Specify array of form fields
*/
CURLOPT_POSTFIELDS => $uploadFiles,
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo($response);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$localFiles = [
'documents' => [
__DIR__ . '/resource/file-1.txt',
__DIR__ . '/resource/file-2.txt',
],
'images' => [
'icon' => __DIR__ . '/resource/github-icon.png',
'octocat' => __DIR__ . '/resource/github-octocat.jpg',
],
];
$uploadFiles = [];
foreach ($localFiles as $fileType => $files) {
foreach ($files as $filePostKey => $uploadFilePath) {
if (!file_exists($uploadFilePath)) {
throw new Exception('File not found: ' . $uploadFilePath);
}
$uploadFileMimeType = mime_content_type($uploadFilePath);
$keyName = sprintf('%s[%s]', $fileType, $filePostKey);
array_push($uploadFiles, [
'name' => $keyName,
'contents' => new SplFileObject($uploadFilePath, 'r'),
'filename' => $keyName,
]);
}
}
$httpClient = new Client();
$response = $httpClient->post(
'https://postman-echo.com/post',
[
RequestOptions::MULTIPART => $uploadFiles,
]
);
echo($response->getBody()->getContents());
{"args":{},"data":{},"files":{"file-1.txt":"data:application/octet-stream;base64,Rmlyc3QgRmlsZSBDb250ZW50Cg==","file-2.txt":"data:application/octet-stream;base64,U2V...=","github-icon.png":"data:application/octet-stream;base64,iVBORw...","github-octocat.jpg":"data:application/octet-stream;base64,/9j/4QAYRXhpZgAASUkqAAg..."},"form":{},"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","content-length":"59650","accept":"*/*","content-type":"multipart/form-data; boundary=------------------------14a7692feb592877","user-agent":"curl/7.58.0","x-forwarded-port":"443"},"json":null,"url":"https://postman-echo.com/post"}
[example]
curl https://httpbin.org/image/jpeg --output /home/serge/curl-examples/02_Advanced/01_Files/04_Download/resource/image.jpeg
[example]
$imageFilePath = __DIR__ . '/resource/image.jpeg';
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://httpbin.org/image/jpeg',
CURLOPT_FILE => fopen($imageFilePath, 'w+')
]);
curl_exec($curlHandler);
if (curl_errno($curlHandler) === CURLE_OK) {
echo 'The image has been successfully downloaded: ' . $imageFilePath;
}
curl_close($curlHandler);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$imageFilePath = __DIR__ . '/resource/image.jpeg';
$imageFileResource = fopen($imageFilePath, 'w+');
$httpClient = new Client();
$response = $httpClient->get(
'https://httpbin.org/image/jpeg',
[
RequestOptions::SINK => $imageFileResource,
]
);
if ($response->getStatusCode() === 200) {
echo 'The image has been successfully downloaded: ' . $imageFilePath;
}
Response
The image has been successfully downloaded: /home/serge/curl-examples/02_Advanced/01_Files/04_Download/resource/image.jpeg
[example]
curl --user postman:password --request GET "https://postman-echo.com/basic-auth"
[example]
$curlHandler = curl_init();
$userName = 'postman';
$password = 'password';
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/basic-auth',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
CURLOPT_USERPWD => $userName . ':' . $password,
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
print_r('First example response: ' . $response . PHP_EOL);
/**
* Or specify credentials in Authorization header
*/
$curlSecondHandler = curl_init();
curl_setopt_array($curlSecondHandler, [
CURLOPT_URL => 'https://postman-echo.com/basic-auth',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Basic ' . base64_encode($userName . ':' . $password)
],
]);
$response = curl_exec($curlSecondHandler);
curl_close($curlSecondHandler);
print_r('Second example response: ' . $response . PHP_EOL);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$userName = 'postman';
$password = 'password';
$httpClient = new Client();
$response = $httpClient->get(
'https://postman-echo.com/basic-auth',
[
RequestOptions::AUTH => [$userName, $password]
]
);
print_r($response->getBody()->getContents());
Response
{"authenticated":true}
[example]
curl --digest --user postman:password --request GET "https://postman-echo.com/digest-auth"
[example]
$curlHandler = curl_init();
$userName = 'postman';
$password = 'password';
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://postman-echo.com/digest-auth',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPAUTH => CURLAUTH_DIGEST,
CURLOPT_USERPWD => $userName . ':' . $password,
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
print_r($response);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$userName = 'postman';
$password = 'password';
$httpClient = new Client();
$response = $httpClient->get(
'https://postman-echo.com/digest-auth',
[
RequestOptions::AUTH => [$userName, $password, 'digest']
]
);
print_r($response->getBody()->getContents());
Response
{"authenticated":true}
[example]
curl -X GET "https://httpbin.org/bearer" -H "Accept: application/json" -H "Authorization: Bearer your_token"
[example]
$curlHandler = curl_init();
$token = 'your_token';
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://httpbin.org/bearer',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Authorization: Bearer ' . $token
],
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
print_r($response);
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
$token = 'your_token';
$httpClient = new Client();
$response = $httpClient->get(
'https://httpbin.org/bearer',
[
RequestOptions::HEADERS => [
'Accept' => 'application/json',
'Authorization' => 'Bearer ' . $token,
]
]
);
print_r($response->getBody()->getContents());
Response
{
"authenticated": true,
"token": "your_token"
}
[example]
curl --cookie "foo=bar;baz=foo" --request GET "https://httpbin.org/cookies"
[example]
$curlHandler = curl_init();
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://httpbin.org/cookies',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIE => 'foo=bar;baz=foo',
/**
* Or set header
* CURLOPT_HTTPHEADER => [
'Cookie: foo=bar;baz=foo',
]
*/
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo $response;
[example]
use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$url = 'https://httpbin.org/cookies';
$urlHost = parse_url($url, PHP_URL_HOST);
$cookieJar = CookieJar::fromArray(
[
'foo' => 'bar',
'baz' => 'foo',
],
$urlHost
);
$response = $httpClient->get(
$url,
[
RequestOptions::COOKIES => $cookieJar,
]
);
echo($response->getBody()->getContents());
Response
{
"cookies": {
"baz": "foo",
"foo": "bar"
}
}
Cookies have attributes that can be sent from the server to the client, but not from the client to the server. The client can only send the name and value of the cookie.
[example]
use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar;
use GuzzleHttp\Cookie\SetCookie;
use GuzzleHttp\RequestOptions;
$httpClient = new Client();
$url = 'https://httpbin.org/cookies';
$urlHost = parse_url($url, PHP_URL_HOST);
$cookies = [
new SetCookie([
'Name' => 'foo',
'Value' => 'bar',
// Other attributes will not be sent to the server, they are only needed for validation.
'Domain' => $urlHost,
'Path' => '/',
'Max-Age' => 100,
'Secure' => false,
'Discard' => false,
'HttpOnly' => false,
]),
new SetCookie([
'Name' => 'baz',
'Value' => 'foo',
'Domain' => $urlHost,
'Path' => '/',
'Max-Age' => 100,
'Secure' => false,
'Discard' => false,
'HttpOnly' => false,
]),
];
$cookieJar = new CookieJar(true, $cookies);
$response = $httpClient->get(
$url,
[
RequestOptions::COOKIES => $cookieJar,
]
);
echo($response->getBody()->getContents());
> GET /cookies HTTP/1.1
Host: httpbin.org
User-Agent: GuzzleHttp/6.3.3 curl/7.58.0 PHP/7.3.6-1+ubuntu18.04.1+deb.sury.org+1
Cookie: foo=bar; baz=foo
Response
{
"cookies": {
"baz": "foo",
"foo": "bar"
}
}
Cookie JAR file structure:
# Domain Flag Path Secure Expiration Name Value
httpbin.org FALSE / FALSE 0 foo bar
httpbin.org FALSE / FALSE 0 baz foo
[example]
curl --cookie "02_Advanced/03_Cookies/03_Send_Cookies_From_File/resource/cookie-jar.txt" --request GET "https://httpbin.org/cookies"
[example]
$curlHandler = curl_init();
$cookieFile = __DIR__ . '/resource/cookie-jar.txt';
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://httpbin.org/cookies',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEFILE => $cookieFile,
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo $response;
Guzzle cookie file structure:
[
{
"Name": "foo",
"Value": "bar",
"Domain": "httpbin.org",
"Path": "\/",
"Max-Age": 100,
"Expires": 1567343671,
"Secure": false,
"Discard": false,
"HttpOnly": false
},
{
"Name": "baz",
"Value": "foo",
"Domain": "httpbin.org",
"Path": "\/",
"Max-Age": 100,
"Expires": 1567343671,
"Secure": false,
"Discard": false,
"HttpOnly": false
}
]
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use GuzzleHttp\Cookie\FileCookieJar;
$httpClient = new Client();
$cookieJarFile = new FileCookieJar(
__DIR__ . '/resource/guzzle-cookie-jar.json',
false
);
$response = $httpClient->get(
'https://httpbin.org/cookies',
[
RequestOptions::COOKIES => $cookieJarFile,
]
);
echo $response->getBody()->getContents();
Response
{
"cookies": {
"baz": "foo",
"foo": "bar"
}
}
[example]
curl --location --cookie-jar "02_Advanced/03_Cookies/04_Save_Response_Cookies_To_File/resource/cookie-jar.txt" --request GET "https://httpbin.org/cookies/set/foo/bar"
[example]
$curlHandler = curl_init();
$cookieFile = __DIR__ . '/resource/cookie-jar.txt';
curl_setopt_array($curlHandler, [
CURLOPT_URL => 'https://httpbin.org/cookies/set/foo/bar',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEJAR => $cookieFile,
CURLOPT_FOLLOWLOCATION => true,
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo $response;
[example]
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use GuzzleHttp\Cookie\FileCookieJar;
$httpClient = new Client();
$cookieJarFile = new FileCookieJar(
__DIR__ . '/resource/guzzle-cookie-jar.json',
true
);
$response = $httpClient->get(
'https://httpbin.org/cookies/set/foo/bar',
[
RequestOptions::COOKIES => $cookieJarFile,
]
);
echo $response->getBody()->getContents();
Response
{
"cookies": {
"foo": "bar"
}
}
Project link