Android应用通过OkHttp3请求SQL Server数据遇EOFException问题求助
解决方案建议
1. 排查服务器端响应完整性与格式
- 确认SQL Server存储过程的返回结果已正确转换为合法的JSON/XML结构,禁止返回空响应或格式残缺的内容。即使无数据,也要返回
{"data": []}这类结构完整的响应,而非直接返回空。 - 检查服务器接口是否正确设置
Content-Length响应头,或启用分块传输编码(Transfer-Encoding: chunked)。OkHttp对响应头合法性要求严格,长度缺失或不匹配会直接导致流提前终止。 - 验证服务器是否在响应发送完成后正常关闭连接,避免异常中断传输。
2. 优化OkHttp客户端配置与调用逻辑
- 调整超时时间,避免因超时过早中断响应读取:
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .build(); - 添加空响应体处理逻辑,解析前先判断响应体是否为空:
ResponseBody body = response.body(); if (body == null) { // 处理空响应场景,比如返回默认空数据集 return Collections.emptyList(); } String responseStr = body.string(); // 后续解析逻辑 - 注意
body.string()只能调用一次,重复调用会导致流关闭触发EOF异常,如需多次使用请先将内容存入变量。
3. 抓包验证请求与响应细节
- 用Charles或Wireshark抓取真机的HTTP请求包,确认:
- 请求参数(含存储过程调用参数)是否完整发送至服务器;
- 服务器返回的响应内容是否完整、无截断,响应头是否符合HTTP规范。
4. 排查真机网络环境
- 确保真机网络稳定,避免在弱网环境下测试,弱网易导致响应传输中断;
- 关闭真机的代理或VPN(若开启),部分代理工具可能篡改或截断HTTP响应。
5. 服务器端接口独立调试
- 用Postman或curl模拟应用的请求参数调用服务器接口,若同样出现异常,说明问题出在服务器端(如存储过程逻辑错误、接口代码bug);若Postman请求正常,则重点排查OkHttp的调用逻辑。
内容的提问来源于stack exchange,提问作者theprodigy133
相关产品推荐
相关产品推荐

