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/curl-examples.git
Go to the directory
cd ./curl-examples
Install composer dependencies
composer install
Run BASH example
bash ./01_Basics/01_Request_Methods/01_Get/console.sh
Run PHP example
php ./01_Basics/01_Request_Methods/01_Get/curl-ext.php
[example]
curl --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,
]);
$response = curl_exec($curlHandler);
curl_close($curlHandler);
echo($response);
[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);
[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"}
curl --request POST "https://postman-echo.com/post" --data "foo=bar&baz=biz"
$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);
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"}
curl --request PUT "https://postman-echo.com/put" --data "foo=bar&baz=biz"
$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);
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);
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);
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]
# 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 https://httpbin.org/image/jpeg --output /home/serge/curl-examples/02_Advanced/01_Files/03_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/03_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"
}
- Set HTTP version
- Get cURL version
- Set User agent
- Cache control
- HTTP Referer
- HTTP methods (HEAD, CONNECT, OPTIONS, TRACE)
- Cookies
- Proxy
- Transfer progress
- Upload array of files in one POST field
- Upload/Download large files
- FTP transfer
- All types of Auth
- Multiple cURL handlers
- SSL certificates
- Streams
- SOAP request
- Best practices