Dart通过POST向PHP传递字符串变量失败,求解决方法
问题排查与解决方案
核心问题分析
你遇到的变量传递失败,大概率是PHP端未正确输出返回数据、SOTP变量本身为空或PHP接收/处理逻辑有疏漏导致的,以下是分步解决方法:
1. 先确认Dart端的SOTP变量有实际值
在发送请求前添加打印,验证变量是否为空:
Future<Verify> verifyOTP() async { // 先确认SOTP的实际值 print("SOTP value: $SOTP"); var response_verifyotp = await http.post(Uri.parse(linkverifyOTP), body: { "OTP_code": SOTP, }); if (response_verifyotp.statusCode == 200) { print(response_verifyotp.body); st_verfiy = Verify.fromJson(json.decode(response_verifyotp.body)); print(st_verfiy.status); } else { // 新增错误状态码打印,排查请求是否成功到达服务器 print("Request failed with status: ${response_verifyotp.statusCode}"); } }
如果打印显示SOTP为空,问题出在前端变量赋值,和请求逻辑无关。
2. 修复PHP端的返回输出与参数处理逻辑
你的PHP代码存在两个关键问题:一是仅执行json_encode但未输出结果,导致Dart端收不到响应;二是未处理变量未定义的情况,可能引发后续逻辑报错。修改后的代码如下:
<?php session_start(); $ch = curl_init(); // 初始化变量,避免未定义报错,同时确认参数是否存在 $OTP_code = isset($_POST["OTP_code"]) ? $_POST["OTP_code"] : ""; $id = isset($_SESSION["id"]) ? $_SESSION["id"] : ""; // 临时添加:打印接收的POST参数,确认是否收到值 var_dump($_POST); curl_setopt($ch, CURLOPT_URL, "https://www.msegat.com/gw/verifyOTPCode.php"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_POST, TRUE); $fields = <<<EOT { "lang":"EN", "userName": "Bloom_Ducks", "apiKey":"f92b62af08ed0be", "code":"$OTP_code", "id": "$id" , "userSender":"APP" } EOT; curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type: application/json" )); $response = curl_exec($ch); $info = curl_getinfo($ch); curl_close($ch); // 新增:判断curl响应是否解析成功 $response = json_decode($response, true); if(!$response){ echo json_encode(array("status" => -1, "msg" => "Curl request failed")); exit; } $code = $response["code"] ?? -1; // 必须用echo输出json结果,否则Dart端收不到数据 if($code == 1){ echo json_encode(array("status" => 1)); }else{ echo json_encode(array("status" => 0)); } ?>
3. 验证PHP是否能接收到参数
运行修改后的代码,查看Dart端打印的response_verifyotp.body:
- 如果
var_dump($_POST)显示OTP_code有值,说明参数传递成功,问题出在后续curl请求或逻辑; - 如果显示为空,说明Dart请求没有正确发送参数,可以尝试显式设置请求头:
var response_verifyotp = await http.post( Uri.parse(linkverifyOTP), headers: {"Content-Type": "application/x-www-form-urlencoded"}, body: { "OTP_code": SOTP, }, );
4. 处理Session的ID为空情况
如果$_SESSION["id"]不存在,原代码中$id会是未定义变量,导致curl的JSON格式异常,上面的PHP代码已经用isset()处理了这个情况,确保JSON格式合法。
内容的提问来源于stack exchange,提问作者lenah
相关产品推荐
相关产品推荐

