Node.js使用sync-request发送POST携带参数未生效问题
问题根因
你使用sync-request的json参数发送POST请求时,库会自动将请求的Content-Type设置为application/json,同时将参数序列化为JSON字符串存入请求体。
而PHP的全局数组$_POST仅自动解析Content-Type为application/x-www-form-urlencoded或multipart/form-data的表单格式请求体,不会处理application/json类型的请求内容,因此后端无法从$_POST中读取到rpi_id参数,触发未定义索引的报错。
解决方案二选一即可
方案1:修改Node端请求,适配现有PHP后端(无需改后端代码)
将sync-request配置中的json参数替换为form参数,form参数会自动将数据编码为PHP可识别的表单格式,修改后的Node代码如下:
var data_id = "data_1"; var url = "https://example.com/get_data.php"; var request = require('sync-request'); var res = request('POST', url, { // 替换原json配置为form配置 form: { 'rpi_id': data_id, }, }); console.log(res.getBody('utf8'))
修改后请求会自动将Content-Type设为application/x-www-form-urlencoded,PHP即可正常解析参数到$_POST中。
方案2:修改PHP后端,兼容JSON格式请求
如果需要发送JSON格式的请求(比如传复杂嵌套参数),可修改PHP代码手动解析JSON请求体,同时增加参数存在判断避免报错,修改后的PHP代码如下:
<?php $data = $_POST; // 兼容JSON格式请求:如果表单参数为空,手动读取原始请求体解析JSON if (empty($data)) { $rawInput = file_get_contents('php://input'); $data = json_decode($rawInput, true); } // 先判断参数是否存在,避免未定义索引报错 $rpi_id = isset($data['rpi_id']) ? $data['rpi_id'] : ''; $res = array('Response'=>'OK','Data'=>$rpi_id); echo json_encode($res); ?>
内容的提问来源于stack exchange,提问作者CodeDezk
相关产品推荐
相关产品推荐

