Android电影搜索App请求仅返回错误,求技术排查
Android电影搜索应用请求失败问题排查
以下是针对你代码的几个关键排查点及修复建议:
1. 补充非成功响应的错误处理
当前代码仅处理了response.isSuccessful为true的场景,完全忽略了API返回4xx/5xx错误的情况(比如API Key无效、参数错误),导致无法定位具体问题。修改onResponse方法:
override fun onResponse(call: Call<MovieResponse>, response: Response<MovieResponse>) { if (response.isSuccessful) { // 原有逻辑不变 } else { // 打印错误状态码和响应体,方便排查 val errorMsg = "响应失败: 状态码${response.code()},信息${response.message()}" Log.e("MovieSearch", errorMsg) label.text = getString(R.string.error) info.text = errorMsg } }
2. 检查MovieApiService的接口定义
OMDb搜索电影的核心参数是s(搜索关键词)和apikey,确保你的接口方法参数名完全匹配:
interface MovieApiService { @GET(".") fun searchMovie( @Query("apikey") apiKey: String, @Query("s") title: String ): Call<MovieResponse> }
如果参数名写错(比如用title代替s),API会返回无效响应。
3. 解决HTTP明文请求限制
Android 9及以上默认禁止HTTP明文请求,你使用的http://www.omdbapi.com/是HTTP协议,需在AndroidManifest.xml的<application>标签中添加配置:
<application ... android:usesCleartextTraffic="true"> ... </application>
否则请求会直接被系统拦截,进入onFailure回调。
4. 打印失败异常信息
当前onFailure仅显示错误提示,没有输出具体异常原因,无法区分是网络问题、解析问题还是API问题。修改onFailure:
override fun onFailure(call: Call<MovieResponse>, t: Throwable) { Log.e("MovieSearch", "请求失败", t) label.text = getString(R.string.error) info.text = t.localizedMessage ?: "未知错误" }
5. 验证数据类字段映射
OMDb返回的搜索结果JSON字段是驼峰大写开头(比如Title、Year、Poster、Type),确保你的MovieResponse和Movie数据类用@SerializedName正确映射:
data class MovieResponse( @SerializedName("Search") val search: List<Movie>?, @SerializedName("Response") val response: String? ) data class Movie( @SerializedName("Title") val title: String?, @SerializedName("Year") val releaseYear: String?, @SerializedName("Poster") val posterPath: String?, @SerializedName("Type") val genre: String? )
如果字段映射错误,Gson解析会失败,导致response.body()为null,甚至触发onFailure。
6. 确认API Key有效性
检查你替换的MY_KEY是否为OMDb官网申请的有效Key,无效Key会导致API返回401错误。
内容的提问来源于stack exchange,提问作者nothin7
相关产品推荐
相关产品推荐

