Flutter报No route to host错误及对接PHP REST API操作MySQL问题求助
问题一:SocketException No route to host (errno 113) 排查修复
- 首先确认运行环境:
10.0.2.2是Android模拟器专属的宿主机映射地址,如果你用真机调试,不能使用该地址,需要直接填写服务端所在设备的局域网IP(一般为192.168.x.x格式) - 检查服务端防火墙设置:确认服务端PHP服务对应的端口(默认一般为80、8080,自定义端口按需确认)已开放,未被防火墙拦截:Linux环境可执行
ufw allow 端口号开放端口,Windows环境可在防火墙高级设置中添加入站规则 - 验证接口可访问性:直接在测试设备的浏览器中输入完整请求地址
${Env.urlPrefix}/list.php,确认可以正常返回数据,排除服务端未启动、路径填写错误的问题 - 检查Android网络权限:确认
android/app/src/main/AndroidManifest.xml中已添加网络权限声明:
<uses-permission android:name="android.permission.INTERNET" />
- 适配Android高版本明文请求限制:如果你的服务端用的是HTTP协议未配置HTTPS,需要在AndroidManifest的
application标签中添加android:usesCleartextTraffic="true",允许明文网络请求
问题二:Flutter 通过PHP REST API写入MySQL实现示例
后端PHP代码示例
生产环境使用请补充参数校验、SQL注入防护、接口权限校验等逻辑,示例代码仅做功能演示
创建add_data.php文件,代码如下:
<?php // 调试阶段可添加跨域配置,生产环境按需限制来源 header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); header("Access-Control-Allow-Methods: POST"); header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); // 数据库连接配置 $host = '数据库地址'; $dbname = '数据库名称'; $username = '数据库用户名'; $password = '数据库密码'; try { $conn = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 接收Flutter端传入的JSON参数 $data = json_decode(file_get_contents("php://input")); // 参数非空校验 if(!empty($data->nama_perusahaan) && !empty($data->alamat)){ // 预编译SQL防止注入 $sql = "INSERT INTO daftar_perusahaan (nama_perusahaan, alamat, telepon) VALUES (:nama, :alamat, :telepon)"; $stmt = $conn->prepare($sql); // 绑定参数 $stmt->bindParam(":nama", $data->nama_perusahaan); $stmt->bindParam(":alamat", $data->alamat); $stmt->bindParam(":telepon", $data->telepon); if($stmt->execute()){ http_response_code(201); echo json_encode(array("message" => "数据添加成功", "status" => true)); }else{ http_response_code(503); echo json_encode(array("message" => "数据添加失败", "status" => false)); } }else{ http_response_code(400); echo json_encode(array("message" => "参数不完整", "status" => false)); } } catch(PDOException $e) { http_response_code(500); echo json_encode(array("message" => "数据库错误: " . $e->getMessage(), "status" => false)); } ?>
Flutter端代码示例
首先在pubspec.yaml中添加http依赖:
dependencies: flutter: sdk: flutter http: ^1.1.0
请求提交代码:
import 'dart:convert'; import 'package:http/http.dart' as http; // 提交数据方法 Future<bool> addPerusahaanData({ required String namaPerusahaan, required String alamat, required String telepon, }) async { try { final url = Uri.parse("${Env.urlPrefix}/add_data.php"); // 组装请求参数 final requestData = jsonEncode({ "nama_perusahaan": namaPerusahaan, "alamat": alamat, "telepon": telepon, }); // 发送POST请求 final response = await http.post( url, headers: {"Content-Type": "application/json"}, body: requestData, ); if (response.statusCode == 201) { final result = jsonDecode(response.body); return result['status'] ?? false; } else { print("请求失败,状态码:${response.statusCode},错误信息:${response.body}"); return false; } } catch (e) { print("请求异常:$e"); return false; } }
内容的提问来源于stack exchange,提问作者lisna octavia
相关产品推荐
相关产品推荐

