0

使用 cURL 作为客户端和 CodeIgniter Rest Server 进行一些测试。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());
    }
?>

结果:

数组(1){ [“------------------1f1e080c85df 内容处置:_form-data;_name”]= > string(174) ""name" syl ------------------------------1f1e080c85df 内容配置:表单数据;名称="email" some@email.it ------------------------------1f1e080c85df-- " }

PUT 方法有什么问题?

4

2 回答 2

2

我遇到了同样的问题并找到了这篇文章。然后我找到了 http_build_query 并且没有“模拟”文件上传就成功了。

curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($content));
于 2014-02-19T14:04:59.953 回答
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);

?>
于 2013-10-29T14:00:36.257 回答