Android中使用Retrofit无需打开浏览器请求URL的实现方法
解决方案
你的问题核心在于协程suspend函数与Call类型混用,以及返回类型选择不当,以下是正确的实现方式:
1. 修正接口定义
Retrofit的suspend函数不需要返回Call<T>(这是回调式异步的用法),针对空响应场景,推荐用Response<Unit>作为返回类型——既能判断请求是否成功,又无需处理响应体:
interface BackEndService { @GET suspend fun hitUrl(@Url url: String): Response<Unit> }
如果不需要关注详细响应状态,也可以直接返回Unit,此时Retrofit会自动适配空响应,仅当请求返回非2xx状态码时抛出HttpException:
interface BackEndService { @GET suspend fun hitUrl(@Url url: String) }
2. 正确调用接口
在协程作用域中执行请求,并处理各类异常:
// 初始化Retrofit实例(注意baseUrl需填写合法根路径,即使使用动态@Url) val retrofit = Retrofit.Builder() .baseUrl("https://example.com/") .build() val backEndService = retrofit.create(BackEndService::class.java) // 在协程中发起请求 coroutineScope.launch { try { val response = backEndService.hitUrl("https://your-target-url.com/") if (response.isSuccessful) { // 请求成功(状态码200-299),无需处理空响应体 } else { // 处理错误状态码 println("请求失败,状态码:${response.code()}") } } catch (e: IOException) { // 处理网络连接错误 e.printStackTrace() } catch (e: HttpException) { // 处理非2xx的HTTP错误 println("HTTP错误:${e.code()}") } }
为什么之前的返回类型无效?
Nothing:表示函数永远不会正常返回,完全不符合请求成功后结束的场景。Any:Retrofit会尝试用配置的转换器(如Gson)解析空响应体,直接导致解析失败抛出异常。
内容的提问来源于stack exchange,提问作者Taimoor Khan
相关产品推荐
相关产品推荐

