Dart http GET请求返回200仍抛异常,如何获取更多排查信息?
如何排查Dart Http客户端的XMLHttpRequest异常?
1. 查看浏览器控制台的原始错误信息
因为你是在浏览器环境下运行Dart代码,直接打开浏览器开发者工具(F12):
- 切换到网络面板,找到目标请求
/api/sweepstakes,查看请求的实际状态、响应头、响应体内容,确认是否和Apache日志一致。 - 切换到控制台面板,这里会显示浏览器原生的XHR错误详情,比如CORS权限问题、响应解析错误等,这些信息是Dart http包封装时隐藏的。
2. 绕过http包封装,直接使用原生XMLHttpRequest
修改代码,手动创建XHR对象并监听更多事件,获取最原始的请求/响应数据:
void main() { final xhr = HttpRequest(); xhr.open('GET', 'http://sweeps.dock/api/sweepstakes'); xhr.setRequestHeader('Accept', 'application/json'); // 监听加载完成事件,打印详细响应 xhr.onLoad.listen((_) { print('状态码: ${xhr.status}'); print('响应头: ${xhr.getAllResponseHeaders()}'); print('响应体内容: ${xhr.responseText}'); }); // 监听错误事件,打印错误上下文 xhr.onError.listen((event) { print('XHR错误事件详情: $event'); print('错误触发时的状态码: ${xhr.status}'); }); xhr.send(); }
通过这种方式,你能直接获取到浏览器XHR的所有细节,不会被http包的异常封装掩盖信息。
3. 验证本地域名解析是否正常
确认sweeps.dock域名是否正确映射到Docker主机的IP:
- 检查系统hosts文件(Windows:
C:\Windows\System32\drivers\etc\hosts;Linux/macOS:/etc/hosts),是否存在类似127.0.0.1 sweeps.dock或Docker主机IP的映射。 - 用
ping sweeps.dock命令测试域名解析结果,确保和Docker容器的实际IP一致。
4. 检查响应内容的合法性
即使Apache返回200,也可能存在响应格式问题:
- 用
curl http://sweeps.dock/api/sweepstakes或Postman请求接口,查看返回的内容是否为合法JSON,是否包含多余字符(比如BOM头、注释)。 - 若响应不是纯JSON,后续
json.decode也会触发错误,但你的异常来自XHR阶段,优先确认响应体是否能被浏览器正常解析。
5. 确认CORS配置的完整性
虽然OPTIONS请求返回200,但浏览器可能因CORS头不全阻止请求:
- 检查Apache的CORS配置,确保返回以下关键头:
Access-Control-Allow-Origin:设置为你的前端域名(比如http://localhost:8080,或用*测试)Access-Control-Allow-Headers:包含你发送的Accept等请求头Access-Control-Allow-Methods:明确包含GET方法
- 在浏览器网络面板中查看OPTIONS请求的响应头,确认这些字段是否存在且配置正确。
内容的提问来源于stack exchange,提问作者rwryme
相关产品推荐
相关产品推荐

