鸿蒙开发中,HTTP请求出现“网络不可用”报错,如何排查和解决?

编写了HTTP请求代码,在模拟器上运行时,能够正常获取网络数据,但在真机上运行时,提示“网络不可用”,无法发送请求。已检查真机网络(WiFi和移动数据都正常),也在config.json中添加了网络权限,但问题仍未解决。请问这是什么原因?鸿蒙应用真机测试时,网络请求失败的常见原因有哪些?该如何排查?比如是否需要配置网络安全策略?

阅读 749
avatarAI BotBETA

在鸿蒙开发中,HTTP请求在真机上出现“网络不可用”错误,而在模拟器上正常,这是一个常见问题。主要原因通常是鸿蒙的网络安全策略默认禁止HTTP明文请求(非HTTPS),真机环境比模拟器更严格。以下是排查和解决步骤,基于HarmonyOS的常见实践(适用于API version 6及以上)。

可能原因

  1. 网络安全策略未配置:鸿蒙默认禁止HTTP请求(明文流量),真机强制执行此策略,而模拟器可能较宽松。
  2. 权限配置错误config.json中的网络权限可能未正确声明或生效。
  3. 真机网络环境问题:如防火墙、VPN、运营商限制或应用被系统限制。
  4. 代码兼容性问题:URL、端口或超时设置可能在真机上无效。
  5. 鸿蒙系统版本差异:真机系统版本较高,API行为更严格。

排查和解决步骤

1. 添加网络安全配置(关键步骤)

  • 鸿蒙要求显式允许HTTP请求。在config.jsonmodule部分添加deviceConfig,启用明文流量:

    {
      "module": {
        "name": "entry", // 替换为你的模块名
        "deviceConfig": {
          "default": {
            "network": {
              "cleartextTraffic": true // 允许HTTP请求
            }
          }
        },
        "reqPermissions": [
          {
            "name": "ohos.permission.INTERNET" // 确保网络权限存在
          }
        ]
      }
    }
  • 为什么有效:真机默认禁用HTTP,此配置覆盖安全策略。修改后,重新编译并安装应用。

2. 验证网络权限

  • 检查config.json中的权限:

    • 确保reqPermissions包含ohos.permission.INTERNET
    • 位置:在module对象内,例如:

      "reqPermissions": [
        { "name": "ohos.permission.INTERNET" }
      ]
  • 真机权限检查:在真机上,进入“设置” > “应用管理” > 你的应用 > “权限”,确认“网络”权限已开启。

3. 测试网络环境和URL

  • 在真机上测试网络:

    • 使用浏览器访问相同URL,确认是否可达。
    • 尝试切换网络(WiFi/移动数据),排除运营商问题。
  • 检查代码中的URL:

    • 确保URL是完整的(如http://example.com/api),避免使用localhost(真机中localhost指向设备自身)。
    • 示例代码(使用ohos.net.http):

      import http from '@ohos.net.http';
      let httpRequest = http.createHttp();
      httpRequest.request(
        "http://example.com", // 替换为你的URL,确保是公网可访问
        {
          method: http.RequestMethod.GET,
          connectTimeout: 60000, // 增加超时时间
          readTimeout: 60000
        }, (err, data) => {
          if (err) {
            console.error('Error:', JSON.stringify(err)); // 打印详细错误
            return;
          }
          console.info('Response:', JSON.stringify(data));
        }
      );
    • 关键点:添加错误日志(console.error)捕获真机错误详情,如err.code(常见错误码:230表示网络不可用)。

4. 检查真机特定设置

  • 关闭真机的“飞行模式”或“省电模式”,这些可能限制后台网络。
  • 禁用VPN或安全软件(如手机管家),临时测试是否被拦截。
  • 确保应用在真机前台运行:鸿蒙可能限制后台网络请求。

5. 使用HTTPS替代HTTP

  • 如果服务支持,改用HTTPS请求(推荐),避免配置cleartextTraffic

    • 修改URL为https://...
    • HTTPS不需要额外安全配置,更安全且兼容性更好。

6. 查看日志和调试

  • 在DevEco Studio中,连接真机调试:

    • 使用HiLogconsole输出日志:

      import hilog from '@ohos.hilog';
      hilog.info(0x0000, 'NetworkTest', 'Request started'); // 添加日志点
    • 在Logcat中过滤错误,搜索http或网络相关关键字。
  • 常见错误码:

    • 230:网络不可用(检查权限或安全策略)。
    • 202:请求超时(调整connectTimeout)。

常见原因总结

  • 网络安全策略未配:占90%以上案例,真机强制HTTP禁止。
  • 权限遗漏config.json未声明或权限未启用。
  • URL问题:真机无法解析内部URL或端口被阻。
  • 系统限制:真机鸿蒙版本较高(如3.0+),API更严格。

后续建议

  • 如果以上步骤无效,提供更多信息(如错误日志、鸿蒙版本、代码片段)进一步分析。
  • 参考鸿蒙官方文档:网络请求开发指南
  • 测试环境:确保真机鸿蒙版本与DevEco Studio兼容,升级到最新SDK。
1 个回答
✓ 已被采纳

鸿蒙 HTTP 请求报 “网络不可用”,先排查基础项:1. 确认设备 / 模拟器联网(WiFi / 移动数据正常,能访问其他网络);2. 检查应用已配置 INTERNET 权限(module.json5/config.json 中声明 ohos.permission.INTERNET,Stage 模型需确认权限在 module 节点下);3. 排查网络代理 / 防火墙(关闭模拟器 / 设备的代理,避免拦截请求);4. 代码层面:检查请求 URL 是否正确(HTTPS 需确认证书适配,低版本鸿蒙可临时关闭 SSL 校验)、网络请求是否在异步线程执行(主线程执行会触发系统拦截)、添加网络状态监听(用 @ohos.net.connection 判断当前网络类型,无网时提示用户);5. 特殊场景:鸿蒙 4.0 + 需确认应用签名为调试签名,模拟器需重启或重新连接网络,真机需关闭 VPN / 网络限流。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进