HTTP请求失败怎么破?鸿蒙开发最全排查实录来了!

HTTP请求失败怎么破?鸿蒙开发最全排查实录来了!_第1张图片

摘要

在鸿蒙系统上开发App,免不了需要和服务端打交道,而 HTTP 请求就是桥梁。但有时候我们写的请求代码,看起来没毛病,结果一运行就是发不出去、没有响应,或者报错。这个时候,不慌,这篇文章会带你从权限到代码,从网络到服务端,逐步排查每一个可能导致失败的点,还配上可运行的示例代码,帮你快速定位问题。

引言

随着 HarmonyOS 的推广,越来越多开发者开始为其生态开发应用,而网络请求功能几乎是所有应用的“标配”。无论是登录注册、拉取数据、还是上传内容,都离不开 HTTP 请求。

但是鸿蒙与传统的 Android 在架构和权限处理上有所不同,这就导致很多开发者在做网络请求时“踩坑”。特别是在刚开始接触时,容易因为一个小小的配置没加或者写法不规范,导致请求失败。

HTTP 请求失败的常见原因与排查方式

权限没配置?请求直接拦住了!

首先看一下 module.json5config.json 中有没有加上网络权限。

"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET"
  }
]

没这权限,系统根本不会让你访问网络,不管你代码写得多好。加完别忘记重启编译。

网络没连上,那就白搭

看似简单,但经常被忽略:

  • 手机是不是飞行模式?
  • 模拟器有没有网络?(部分模拟器默认断网)
  • Wi-Fi 或 4G 开关开了吗?

你可以用 Ping 命令或者打开浏览器测试一下。

请求地址、方法、请求体都对了吗?

示例代码:使用 XMLHttpRequest

let xhr = new XMLHttpRequest();
xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts/1', true);

xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    if (xhr.status === 200) {
      console.log('返回数据:', xhr.responseText);
    } else {
      console.error('HTTP请求失败,状态码:', xhr.status);
    }
  }
};

xhr.send();

几点注意:

  • URL要完整,不能写成 /api/test,得写成 http://你的完整地址
  • GET 不用传数据,POST 则需要 send(body)
  • Header 要配上,如 Content-Type: application/json

服务端问题也不能排除

建议用 Postman 或 curl 测一下接口,看看是不是接口自身挂了。

如果服务器没开,或者报错 500/404,那问题可能不在你代码上。

请求跨域被拦了?CORS 了解一下

如果你请求的是非同源地址(比如开发环境访问远程 API),需要服务端支持 CORS:

Flask 端示例:

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route('/api/test')
def test():
    return {"msg": "ok"}

服务端要返回允许跨域的 Header,否则浏览器直接拒绝。

鸿蒙 SDK 或 IDE 版本太老

建议定期升级 DevEco Studio 和 SDK。

老版本 SDK 有时候会在网络层出错,升级后问题迎刃而解。

应用场景代码示例

场景一:登录接口请求

let xhr = new XMLHttpRequest();
xhr.open('POST', 'https://example.com/api/login', true);
xhr.setRequestHeader('Content-Type', 'application/json');

xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    if (xhr.status === 200) {
      console.log('登录成功:', xhr.responseText);
    } else {
      console.error('登录失败:', xhr.status);
    }
  }
};

let data = JSON.stringify({ username: 'admin', password: '123456' });
xhr.send(data);

场景二:获取列表数据

let xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/api/list', true);

xhr.onreadystatechange = function () {
  if (xhr.readyState === 4 && xhr.status === 200) {
    let list = JSON.parse(xhr.responseText);
    console.log('数据列表:', list);
  }
};

xhr.send();

场景三:上传文件数据

let xhr = new XMLHttpRequest();
xhr.open('POST', 'https://example.com/upload', true);

let formData = new FormData();
formData.append('file', myFile);

xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    if (xhr.status === 200) {
      console.log('上传成功');
    } else {
      console.error('上传失败', xhr.status);
    }
  }
};

xhr.send(formData);

QA 问答环节

Q1:为什么请求完全没响应?

很可能权限没配,或者地址写错。先看控制台有没有报错,再用 Postman 验证接口。

Q2:能用 Fetch 或其他库吗?

目前鸿蒙主要支持 XMLHttpRequest,部分 API 可能不兼容 Fetch,建议用标准方式来保证兼容性。

Q3:控制台提示跨域怎么办?

修改服务端代码,允许你的源访问,比如加 Access-Control-Allow-Origin: *

总结

HarmonyOS 下的网络请求虽不复杂,但细节挺多。一不小心就会踩坑,比如:权限没配、地址写错、服务器问题、跨域限制等等。

记住以下排查流程:

  1. 检查权限声明
  2. 确认网络连接
  3. 验证请求格式(URL、方法、头、体)
  4. 确认服务端接口是否正常
  5. 日志调试 + Postman 验证

一步步排查,HTTP 请求就不再神秘!

你可能感兴趣的:(harmonyos)