Retrofit调用Rapid API报错:Expected BEGIN_ARRAY but was STRING求助
Retrofit调用Rapid API报错:Expected BEGIN_ARRAY but was STRING的排查与解决
你遇到的报错Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $,核心原因是Retrofit发送的请求与Postman不一致,导致API返回的不是预期的JSON数组,而是字符串(比如错误信息)。以下是具体排查和修复步骤:
1. 修正API接口的@GET注解写法
你的接口代码中,@GET("on={kanji}")的写法错误,把查询参数当成了路径参数处理。Postman中你应该是用?on=shin作为查询参数发送请求,但Retrofit里的错误写法会生成错误的URL,导致API返回非预期内容。
错误的接口代码:
interface RapidService { @Headers("rapidapi-key:xxxxxxxxxxxxxxx") @GET("on={kanji}") suspend fun getKanji(@Path("kanji")kanji:String): Response<List<PojoKanjiItem>> }
修复后的接口代码:
interface RapidService { @Headers("rapidapi-key:xxxxxxxxxxxxxxx") @GET suspend fun getKanji(@Query("on") kanji: String): Response<List<PojoKanjiItem>> }
解释:@Query("on")会自动在URL末尾拼接?on=shin,生成正确的请求地址,和Postman的请求一致。
2. 验证请求URL是否正确
可以添加OkHttp日志拦截器,查看实际发送的请求URL和响应内容,确认与Postman一致:
// 需先在build.gradle添加依赖:implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0' val okHttpClient = OkHttpClient.Builder() .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) .build() val retrofit = Retrofit.Builder() .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) // 排查阶段建议去掉setLenient(),严格校验格式 .baseUrl("https://app.kanjialive.com/api/public/search/advanced/") .build()
添加后,Logcat会输出完整的请求URL、请求头和响应体,方便快速定位问题。
3. 其他检查点
- 确认
rapidapi-key与Postman中使用的完全一致,密钥错误会导致API返回错误字符串。 - 暂时移除
GsonBuilder().setLenient(),宽松模式会掩盖格式问题,确保请求正确后再考虑是否启用。
内容的提问来源于stack exchange,提问作者Bradboyee
相关产品推荐
相关产品推荐

