摘要
在鸿蒙系统上开发App,免不了需要和服务端打交道,而 HTTP 请求就是桥梁。但有时候我们写的请求代码,看起来没毛病,结果一运行就是发不出去、没有响应,或者报错。这个时候,不慌,这篇文章会带你从权限到代码,从网络到服务端,逐步排查每一个可能导致失败的点,还配上可运行的示例代码,帮你快速定位问题。
引言
随着 HarmonyOS 的推广,越来越多开发者开始为其生态开发应用,而网络请求功能几乎是所有应用的“标配”。无论是登录注册、拉取数据、还是上传内容,都离不开 HTTP 请求。
但是鸿蒙与传统的 Android 在架构和权限处理上有所不同,这就导致很多开发者在做网络请求时“踩坑”。特别是在刚开始接触时,容易因为一个小小的配置没加或者写法不规范,导致请求失败。
HTTP 请求失败的常见原因与排查方式
权限没配置?请求直接拦住了!
首先看一下 module.json5
或 config.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 下的网络请求虽不复杂,但细节挺多。一不小心就会踩坑,比如:权限没配、地址写错、服务器问题、跨域限制等等。
记住以下排查流程:
- 检查权限声明
- 确认网络连接
- 验证请求格式(URL、方法、头、体)
- 确认服务端接口是否正常
- 日志调试 + Postman 验证
一步步排查,HTTP 请求就不再神秘!