Curl PUT 请求并清空请求数据(restapi)
Curl PUT Request and empty request data (rest api)
我正在尝试发出 PUT 请求,以便编辑某些用户的数据,但我收到的是空数据,而不是我通过请求发送的数据。
我已经尝试使用 postman(一个 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
操作...这段代码有什么问题?
两个问题。
当使用CURLOPT_PUT
时,您必须使用CURLOPT_INFILE
来定义要发送的数据,即您的代码目前根本不发送任何数据。
CURLOPT_PUT
TRUE to HTTP PUT
a file. The file to PUT
must be set with CURLOPT_INFILE and CURLOPT_INFILESIZE.
您正在将数据定义为数组。
CURLOPT_POSTFIELDS
[...] If value is an array, the Content-Type
header will be set to multipart/form-data
.
http://php.net/manual/en/function.curl-setopt.php
因此,即使数据被发送,它也会作为表单数据发送,请求处理程序组件将无法解码(它需要一个 JSON 字符串),即使它会尝试,但不会,因为除非您将数据作为字符串传递,否则不会设置您的自定义 Content-Type
header。
长话短说,使用 CURLOPT_CUSTOMREQUEST
而不是 CURLOPT_PUT
,并将数据设置为 JSON 字符串。
curl_setopt($process, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($process, CURLOPT_POSTFIELDS, json_encode($data));
您的 Postman 请求可能有类似的问题。
我正在尝试发出 PUT 请求,以便编辑某些用户的数据,但我收到的是空数据,而不是我通过请求发送的数据。
我已经尝试使用 postman(一个 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
操作...这段代码有什么问题?
两个问题。
当使用
CURLOPT_PUT
时,您必须使用CURLOPT_INFILE
来定义要发送的数据,即您的代码目前根本不发送任何数据。CURLOPT_PUT
TRUE to
HTTP PUT
a file. The file toPUT
must be set with CURLOPT_INFILE and CURLOPT_INFILESIZE.您正在将数据定义为数组。
CURLOPT_POSTFIELDS
[...] If value is an array, the
Content-Type
header will be set tomultipart/form-data
.http://php.net/manual/en/function.curl-setopt.php
因此,即使数据被发送,它也会作为表单数据发送,请求处理程序组件将无法解码(它需要一个 JSON 字符串),即使它会尝试,但不会,因为除非您将数据作为字符串传递,否则不会设置您的自定义
Content-Type
header。
长话短说,使用 CURLOPT_CUSTOMREQUEST
而不是 CURLOPT_PUT
,并将数据设置为 JSON 字符串。
curl_setopt($process, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($process, CURLOPT_POSTFIELDS, json_encode($data));
您的 Postman 请求可能有类似的问题。