CodeIgniter Rest Server通过cURL使用PUT方法失败

时间:2013-10-29 11:17:53

标签: rest put codeigniter-restserver

使用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方法有什么问题?

2 个答案:

答案 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);

?>