tags:

views:

68

answers:

4

I need to do a simple GET request to EC2 Query API with regular URL encoded query string. The protocol is HTTPS. How would I send the request with the help of PHP's cURL.

+1  A: 

Sending a request via curl, to an HTTPS URL, is not that hard by itself, in terms of PHP code.

Something like this should do perfectly fine (I just tried this portion of code on my machine, Windows, PHP 5.3) :

$url = 'https://.../...';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  2);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);

echo $data;

And it outputs the result fine : the same thing I get in my browser when trying to access the https:// URL ; except for the CSS, of course.


You might want to take a look at the manual page of the curl_setopt function : there are a lot of options, and some of those might be useful, in your specific case :-)

Here, I used CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST ; not sure you'll need those with Amazon, but I had to use them, else this portion of code didn't work -- but that might be related to the fact that the certificate I'm using is self-signed... Try with and without those, and you'll quickly find out if you need them.

Pascal MARTIN
url http://... ?
Sarfraz
@Sarfraz > ergh, damn copy-paste *(I copied-pasted an URL from my browser, without noticing it didn't add the 's' as it used to on my previous server)* ;; I've edited my answer to correct that ;; thanks for the comment :-)
Pascal MARTIN
you are welcome :)
Sarfraz
+3  A: 

Example:

$url = "https://example.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  2);

$result = curl_exec($ch);
curl_close($ch);

print_r($result);

CURLOPT_SSL_VERIFYPEER

Check if peer certificate is valid or invalid/expired.

CURLOPT_SSL_VERIFYHOST quoting from php manual:

1 to check the existence of a common name in the SSL peer certificate. 2 to check the existence of a common name and also verify that it matches the hostname provided.

rogeriopvl
Could you describe why SSL_VERIFYPEER and SSL_VERIFYHOST are required?
King of Zhopa
I edited my answer.
rogeriopvl
+1  A: 

If you want to configure CURL to blindly accept the certificate you can set the CURLOPT_SSL_VERIFYPEER option to false.

$url = 'https://www.example.com/abc';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Blindly accept the certificate
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);
Stephen Curran
A: 

You could also use Zend Framework and the cURL adapter to help with this task. Details here