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
数据类型时发生了什么?
- 更重要的是,如何通过PUT方法提交和解析JSON DATA?
您将数据设置为 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
选项存在一些问题。具体来说,您可以混合使用 POST
和 PUT
设置。删除此行:
curl_setopt($ch, CURLOPT_POST, true);
移除:
curl_setopt($ch, CURLOPT_POST, true);
我正在 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
数据类型时发生了什么? - 更重要的是,如何通过PUT方法提交和解析JSON DATA?
您将数据设置为 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
选项存在一些问题。具体来说,您可以混合使用 POST
和 PUT
设置。删除此行:
curl_setopt($ch, CURLOPT_POST, true);
移除:
curl_setopt($ch, CURLOPT_POST, true);