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 ответ
Две проблемы.
Когда используешь
CURLOPT_PUT
, вы должны использоватьCURLOPT_INFILE
определить данные для отправки, т.е. ваш код в настоящее время не отправляет никаких данных вообще.CURLOPT_PUT
ВЕРНО в
HTTP PUT
файл. Файл вPUT
должен быть установлен с CURLOPT_INFILE и CURLOPT_INFILESIZE.Вы определяете данные как массив.
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));
Ваш запрос почтальона, вероятно, имеет аналогичную проблему.