Kotlin中使用OkHttp编码URL及解决Bitfinex API空结果问题
问题解决:Bitfinex API调用返回空结果的原因及修复
你的代码核心问题是错误地读取了响应体内容,导致看似得到空结果,实际是没正确获取API返回的数据。
问题分析
你代码中使用response.body().toString(),这个方法返回的是ResponseBody对象的内存地址字符串(类似okhttp3.ResponseBody@xxxxxx),而不是API返回的JSON数据。浏览器能正常获取是因为它自动解析了响应体内容,但OkHttp需要显式读取响应体的流内容。
修正后的代码
fun getBitfinexCandleHist(): String { val client = OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .build() val url = HttpUrl.Builder() .scheme("https") .host("api.bitfinex.com") .addPathSegment("v2") .addPathSegment("candles") .addPathSegment("trade:1h:tBTCUSD") .addPathSegment("hist") .addQueryParameter("sort", "1") .build() val request = Request.Builder() .url(url) .header("User-Agent", "Kotlin-OkHttp-Client") // 部分API要求标识请求来源 .build() return try { client.newCall(request).execute().use { response -> if (!response.isSuccessful) throw IOException("请求失败: ${response.code}") response.body?.string() ?: "" } } catch (e: IOException) { "请求异常: ${e.message}" } }
关键修改点
- 使用
response.body?.string()读取实际的响应内容,该方法会将响应体的流转换为字符串。 - 用
use函数自动关闭Response对象,避免资源泄漏(OkHttp的响应体必须关闭)。 - 添加了超时设置,防止请求长时间挂起。
- 增加了
User-Agent请求头,部分API会拒绝无标识的请求。 - 增加异常捕获,处理网络请求中的IO错误。
额外注意事项
string()方法只能调用一次,因为它会消耗响应体的输入流,再次调用会返回空。如果需要多次使用内容,应该将结果保存到变量中。- 若仍有问题,可以打印完整的
url确认是否和浏览器访问的一致(你的URL构建逻辑是正确的,不存在编码问题)。
内容的提问来源于stack exchange,提问作者Xokarca
相关产品推荐
相关产品推荐

