【问题标题】:Curl PUT Request and empty request data (rest api)Curl PUT 请求和清空请求数据(rest api)
【发布时间】:2016-04-01 17:21:29
【问题描述】:

我正在尝试发出 PUT 请求,以编辑某些用户的数据,但我收到的是空数据,而不是我通过请求发送的数据。

我尝试过使用 postman(一个 chrome 插件)和自定义 php sn-p:

?php
$process = curl_init('http://localhost/myapp/api/users/1.json');

$headers = [
    'Content-Type:application/json',
    'Authorization: Basic "...=="'
];
$data = [
    'active' => 0,
    'end_date' => '01/01/2018'
];

curl_setopt($process, CURLOPT_HTTPHEADER, $headers);
curl_setopt($process, CURLOPT_TIMEOUT, 30);
curl_setopt($process, CURLOPT_PUT, 1);
curl_setopt($process, CURLOPT_POSTFIELDS, $data);
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
$return = curl_exec($process);
curl_close($process);

print_r($return);

这是我正在使用 cakephp 端的代码:

class UsersController extends AppController
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');
    }

    ....    

    public function edit($id = null)
    {
        debug($_SERVER['REQUEST_METHOD']);
        debug($this->request->data);
        die;
    }

    ....

这就是它的输出:

/src/Controller/UsersController.php (line 318)
'PUT'


/src/Controller/UsersController.php (line 319)
[]

我很困惑...类似的代码适用于 POST 请求和 add 操作...此代码有什么问题?

【问题讨论】:

    标签: cakephp-3.x cakephp-3.1


    【解决方案1】:

    两个问题。

    1. 当使用CURLOPT_PUT时,你必须使用CURLOPT_INFILE来定义要发送的数据,即你的代码目前根本不发送任何数据。

      CURLOPT_PUT

      TRUEHTTP PUT 一个文件。 PUT 的文件必须使用 CURLOPT_INFILECURLOPT_INFILESIZE 设置。

      http://php.net/manual/en/function.curl-setopt.php

    2. 您将数据定义为数组。

      CURLOPT_POSTFIELDS

      [...] 如果 value 是一个数组,则 Content-Type 标头将设置为 multipart/form-data

      http://php.net/manual/en/function.curl-setopt.php

      因此,即使要发送数据,它也会作为表单数据发送,请求处理程序组件将无法解码(它需要一个 JSON 字符串),即使它会尝试解码,它不会,因为除非您将数据作为字符串传递,否则不会设置您的自定义 Content-Type 标头。

    长话短说,使用CURLOPT_CUSTOMREQUEST 而不是CURLOPT_PUT,并将您的数据设置为JSON 字符串。

    curl_setopt($process, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($process, CURLOPT_POSTFIELDS, json_encode($data));
    

    您的 Postman 请求可能存在类似问题。

    【讨论】:

      猜你喜欢
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多