You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:05:22