以前说到, Dart 是个年轻的语言,SDK 还不够成熟,使用中有很多坑。之前解决 了一个使用代理导致空指针的问题,这次又碰上了一个使用 Cookie 产生 FormatException 的问题。
问题描述
dio是Flutter中文网开源的一个强大的Dart Http请求库,我使用这个库写了 一个访问网站 Login 接口的 Demo。
Dio client = new Dio(options);
client.interceptors.add(CookieManager(CookieJar()));
FormData formData = new FormData.from(
{"id": 123456, "passwd": 456789, "CookieDate": "2"});
var response = await client.post<String>(
"/path/to/login.json",
data: formData,
);
代码很简单:
- 使用 dio 发起一个 Post 请求,包含用户名和密码,调用 web login 接口;
- 服务器response 包含 set-cookie 设置登录信息; 后续访问需要携带 cookie.
- 客户端使用 CookieManager(CookieJar()) 保存 cookie信息。
然而很不幸,简单的代码遇上了如下错误:
DioError [DioErrorType.DEFAULT]: FormatException: Invalid character in cookie name, code unit: '91' (at character 5) main[UTMPUSERID]
抓出服务器响应分析:
set-cookie: main[UTMPUSERID]=guest; path=/; domain=.****.net
set-cookie: main[UTMPKEY]=48990095; path=/; domain=.****.net
set-cookie: main[UTMPNUM]=79117; path=/; domain=.****.net
set-cookie 字段包含了非法字符"["和"]",导致请求失败。
问题已经定位,请服务器兄弟吃顿烧烤,改一下 set-cookie 字符串定义,问题解决。 ^_^