鸿蒙HarmonyOS应用开发
更新于 2026-09-18
鸿蒙ArkWeb与Http请求的Cookie共享与踩坑记录
背景
ArkWeb(WebView)与Http网络请求需要共享Cookie以维持登录态,但实际接入时频繁报错。本文按排查顺序记录问题与修复。
参考:官方错误码文档
https://developer.huawei.com/consumer/cn/doc/harmonyos-references/errorcode-webview
错误一:invalid url(17100002)
官方说明:
1 | 17100002 Url格式错误 |
实情:我这边是“传入的url不对”导致(带了不必要的参数/格式不规范)。修正URL后继续验证。
错误二:cookie value格式错误(17100005)
官方说明:
1 | 17100005 cookie value格式错误 |
定位过程:
- 我最初使用
import { http } from '@kit.NetworkKit';发起请求,读取response.cookies,看到类型是 string,就以为可以直接configCookieSync(url, cookies); - 但真实情况是:这个
cookies并非“原始Cookie请求头字符串”,而是一个“格式化后的cookie导出文本”,中间包含制表符(\t)。例如:
1 | #HttpOnly_abc.com.cn FALSE /v4/ FALSE 0 JSESSIONID C939723C706D2182B11F33D5A37927BE |
- 这种格式不符合
WebCookieManager.configCookieSync()所需要的 Cookie 写入规范,因而被系统拒绝。
正确做法:从响应头提取原始Cookie
不要直接用 response.cookies。应当从响应头的 Set-Cookie / Set-Cookie2(以及少量旧接口的 Cookie / Cookie2)中提取逐条Cookie后写入。
下面方法做了兼容性解析,处理了:
Set-Cookie一行内的多个 Cookie(逗号与 Expires 冲突);- 多行合并/换行的场景;
- 既支持数组,也支持单值;
- 兼容少量旧服务端返回的
Cookie/Cookie2。
1 | /** 解析响应头中的 Cookie,返回逐条 cookie 字符串 */ |
把Cookie写入ArkWeb的CookieStore
1 | import { webview as ArkWebview } from '@kit.ArkWeb'; |
要点:
- (非必需,只为了缩短url长度)写入前剥离URL上的查询参数,只保留协议+主机+路径(与Cookie作用域匹配);
- 写入后调用
saveCookieSync()持久化(不调用持久化接口的话,更新会延迟一些);
常见坑位与排查建议
- 不要把 NetworkKit 的
response.cookies直接喂给configCookieSync(); - URL不规范会触发 17100002;Cookie串不合规会触发 17100005;
Set-Cookie逗号切分要避开Expires=中的逗号;
总结
终于生效了,总算是把这个小小的 Cookie 坑填上了。看起来不复杂,但细节是真的多:URL 一不规范就 17100002,Cookie 串不合规就 17100005,response.cookies 还不是原始值,直接拿来用就会挨打。说实话,这种“看起来像样其实不能直接用”的字段最容易骗新人(也骗我)。