使用cURL作为客户端和CodeIgniter Rest服务器进行一些测试。 GET,POST和DELETE方法完美但不是PUT。
这是我的PUT客户端代码。它与POST相同(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;
?>
我还尝试添加标题:'Content-Type: application/x-www-form-urlencoded',
。结果相同。
我的服务器代码:
<?php
function app_put() {
var_dump($this->put());
}
?>
结果:
array(1){[“------------------------------ 1f1e080c85df Content-Disposition:_form-data; _name“] =&gt; string(174)”“name”syl ------------------------------ 1f1e080c85df Content-Disposition:form-data; name =“email”some@email.it ------------------------------ 1f1e080c85df--“}
PUT方法有什么问题?
答案 0 :(得分:2)
我遇到了同样的问题并找到了这篇文章。然后我找到了http_build_query,并且没有“模拟”文件上传就完成了这个技巧。
curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($content));
答案 1 :(得分:0)
刚刚找到正确的方法。你必须“模拟”文件上传。仅适用于PUT请求:
<?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);
?>