Curl PUT Request и пустые данные запроса (остальные API)

Я пытаюсь сделать запрос PUT, чтобы отредактировать данные некоторых пользователей, но я получаю пустые данные вместо того, что я отправляю через мой запрос.

Я пытался с почтальоном (плагин Chrome) и с пользовательским фрагментом PHP:

?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 действие... что не так с этим кодом?

1 ответ

Решение

Две проблемы.

  1. Когда используешь CURLOPT_PUT, вы должны использовать CURLOPT_INFILE определить данные для отправки, т.е. ваш код в настоящее время не отправляет никаких данных вообще.

    CURLOPT_PUT

    ВЕРНО в HTTP PUT файл. Файл в PUT должен быть установлен с CURLOPT_INFILE и CURLOPT_INFILESIZE.

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

  2. Вы определяете данные как массив.

    CURLOPT_POSTFIELDS

    [...] Если значение является массивом, 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));

Ваш запрос почтальона, вероятно, имеет аналогичную проблему.

Другие вопросы по тегам