2016-04-01 9 views
1

Я пытаюсь сделать запрос PUT, чтобы редактировать некоторые данные пользователя, но я получаю пустые данные вместо того, что я отправляю по моему запросу.Curl PUT Запрос и данные пустого запроса (rest api)

Я попытался с почтальоном (хром плагин) и пользовательских 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 action ... что не так с этим кодом?

ответ

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

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