Doing some tests with cURL as client and the CodeIgniter Rest Server. GET, POST and DELETE methods work perfectly but not PUT.
Here is my client code for PUT. It's the same as POST (except for CURLOPT_CUSTOMREQUEST):
<?php
/**
* Keys
*/
include('inc/keys.inc.php');
/**
* Data sent
*/
$content = array(
'name' => 'syl',
'email' => 'some@email.it'
);
/**
* Source
*/
$source = 'http://localhost/test-rest-api-v2/api_apps/app/id/1';
/**
* Init cURL
*/
$handle = curl_init($source);
/**
* Headers
*/
$headers = array(
'X-API-Key: '. $public_key
);
/**
* Options
*/
curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
/**
* For POST
*/
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($handle, CURLOPT_POSTFIELDS, $content);
/**
* Result
*/
$result = curl_exec($handle);
/**
* Close handle
*/
curl_close($handle);
echo $result;
?>
I also tried to add to the headers: 'Content-Type: application/x-www-form-urlencoded',
. Same result.
My server code:
<?php
function app_put() {
var_dump($this->put());
}
?>
Result:
array(1) { ["------------------------------1f1e080c85df Content-Disposition:_form-data;_name"]=> string(174) ""name" syl ------------------------------1f1e080c85df Content-Disposition: form-data; name="email" some@email.it ------------------------------1f1e080c85df-- " }
What's wrong with the PUT method?
Just found the right way. You have to "simulate" a file uploading. For PUT requests only:
<?php
/**
* Data
*/
$data = array(
'name' => 'syl',
'email' => 'some@email.it'
);
/**
* Convert array to an URL-encoded query string
*/
$data = http_build_query($data, '', '&');
/**
* Open PHP memory
*/
$memory = fopen('php://memory', 'rw');
fwrite($memory, $data);
rewind($memory);
/**
* Simulate file uploading
*/
curl_setopt($handle, CURLOPT_INFILE, $memory);
curl_setopt($handle, CURLOPT_INFILESIZE, strlen($data));
curl_setopt($handle, CURLOPT_PUT, true);
?>