Retrofit2调用Wikipedia API未获取预期响应问题排查
问题分析与解决办法
针对你遇到的两个问题,我分别拆解原因并给出解决方案:
一、Retrofit请求后pages字段为空的问题
浏览器能正常获取结果但Retrofit返回pages为空,大概率是Gson解析实体类的结构不匹配——结合维基MediaWiki API的返回格式,这里的pages是一个以页面ID为动态键的JSON对象,而非数组或固定结构的对象。
原因详解
维基API的返回结构大致如下:
{ "query": { "pages": { "123456": { "pageid": 123456, "title": "Image:Monet 1871 Seascape.jpg", "imageinfo": [ { "url": "https://upload.wikimedia.org/..." } ] } } } }
如果你的WikiObject类中pages字段定义为普通对象或List,Gson无法解析这种动态键的结构,就会导致pages为空。
解决办法
修改WikiObject的结构,将pages定义为Map<String, PageDetail>(其中PageDetail是对应页面信息的实体类):
public class WikiObject { private Query query; public static class Query { // 用Map接收动态键的pages对象 private Map<String, PageDetail> pages; // getter/setter方法 } public static class PageDetail { private int pageid; private String title; private List<ImageInfo> imageinfo; // getter/setter方法 } public static class ImageInfo { private String url; // getter/setter方法 } // getter/setter方法 }
另外再排查两个小细节:
- 确认
@Query参数的编码:Retrofit默认会对titles中的空格等特殊字符进行URL编码,和浏览器行为一致,这部分应该没问题,但可以通过抓包工具(如Charles)验证实际请求URL; - 确保
format参数正确:你调用时传了"json",和浏览器请求的默认行为一致,无需调整。
二、Unable to resolve Lretrofit2/Response; annotation class 7336' 错误
这个错误是Retrofit相关类无法被找到,核心是依赖或构建配置问题,常见原因和解决办法如下:
可能原因1:依赖版本不兼容或未正确引入
确保你的构建文件(Gradle/Maven)中引入了正确的Retrofit和Gson Converter依赖,且版本完全一致。比如Gradle配置:
// Retrofit核心依赖 implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Gson Converter依赖 implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
注意:Retrofit与Converter的版本必须严格匹配,否则会出现类找不到的问题。
可能原因2:构建缓存或同步问题
- 执行
Clean Project和Rebuild Project(Android Studio),清除旧的构建缓存; - 刷新Gradle/Maven依赖,确保所有依赖都正确下载到本地仓库。
可能原因3:混淆配置问题
如果你的项目开启了代码混淆(ProGuard/R8),需要在混淆规则中添加Retrofit的排除规则,避免核心类被混淆:
# Retrofit相关混淆规则 -dontwarn retrofit2.** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions
内容的提问来源于stack exchange,提问作者seekingStillness
相关产品推荐
相关产品推荐

