PHP : 解析 JSON "PUT" 数据给出 EMPTY 数组?

PHP : Parsing the JSON "PUT" data giving EMPTY Array?

我正在 PHP 中制作一个小 API。我在使用 PUT 动词时遇到了一些问题。这是我的 PUT.

测试脚本

(提交者)submit.php:

$data = array("fruit"=>"watermelon", "destination"=>"germany");
$data = json_encode($data);

// echo json_last_error(); //Returns: 0 (JSON Data Integrity Check. So I supposed there is NO ERROR in JSON Object)

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/api.php");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data)));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$respond = curl_exec($ch);
curl_close($ch);
print_r($respond);

(接收者)api.php:

$decoded_input = json_decode(file_get_contents("php://input"), true);
parse_str($decoded_input, $putdata);
echo json_encode( $putdata );

输出

[]

但是..等等!

但是....当我在提交中不使用 JSON 数据类型时(注释掉下面 2 行):

//$data = json_encode($data);
//curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data)));

然后我得到了类似这样的返回:

stdClass Object ( [------------------------------4f5f68d9cc92 Content-Disposition:_form-data;_name] => "fruit" watermalon ------------------------------4f5f68d9cc92 Content-Disposition: form-data; name="origin" germany ------------------------------4f5f68d9cc92-- )

您将数据设置为 JSON 字符串

$data = json_encode($data);

然后尝试使用 parse_str

检索它
parse_str( file_get_contents("php://input"), $putdata);

parse_str 无法解析 JSON。你需要 json_decode:

// will be NULL if the decode fails
$putdata = json_decode(file_get_contents("php://input"),true);
if(is_null($putdata)) die(json_last_error());

我还注意到您的 CURL 选项存在一些问题。具体来说,您可以混合使用 POSTPUT 设置。删除此行:

curl_setopt($ch, CURLOPT_POST, true);

移除:

curl_setopt($ch, CURLOPT_POST, true);