【问题标题】:Call or Response in Retrofit?改造中的呼叫或响应?
【发布时间】:2021-01-15 08:43:45
【问题描述】:

我想知道 Call 和 Response 之间的区别?在 Retrofit 中何时使用 Call 和何时使用 Response

@GET("/albums/{id}")
suspend fun functionOne(@Path(value = "id") albumsId:Int):Response<Albums>
@GET("/albums/{id}")
suspend fun functionTwo(@Path(value = "id") albumsId:Int):Call<Albums>

这两个函数对我来说都很好,它们都有不同的实现,但用途几乎相同。

1.哪种响应类型适合最佳实践?

2。何时使用响应和呼叫?

【问题讨论】:

  • 如果您查看它们各自的导入,那么 Response 和 Call 来自哪个库?是来自 Retrofit 还是 OkHttp?

标签: android android-studio kotlin retrofit2 kotlin-coroutines


【解决方案1】:

“Call”在我们愿意使用它的入队回调函数时很有用。

 call.enqueue(new Callback<Info>() {
            @Override
            public void onResponse(Call<Info> call, Response<Info> response) {

                Info info = response.body();

                if (info != null && info.getRestResponse() != null) {

                    results = (ArrayList<Result>) info.getRestResponse().getResult();
                    viewData();
                }
            }

            @Override
            public void onFailure(Call<Info> call, Throwable t) {

            }
        });

当我们在项目中使用 Coroutines 或 RxJava(这是最好的专业实践)来提供异步执行时,我们不需要 enqueue 回调。我们可以只使用响应。

suspend fun getMoviesFromAPI(): List<Movie> {
        lateinit var movieList: List<Movie>
        try {
            val response = movieRemoteDatasource.getMovies()
            val body = response.body()
            if(body!=null){
                movieList = body.movies
            }
        } catch (exception: Exception) {
            Log.i("MyTag", exception.message.toString())
        }
        return movieList
    }  

【讨论】:

    【解决方案2】:

    1。哪种响应类型适合最佳实践?

    我认为这取决于您的用例。通过使用retrofit2.Response&lt;T&gt;,我们可以访问errorBody()(不成功响应的原始响应正文。)、code()(HTTP 状态码。)或headers()(HTTP 标头)。

    2。何时使用响应和呼叫?

    • 响应:如上
    • 调用:不需要,因为回调类型(例如Call)被suspend function 替换。第二种方法可能更简单,例如:
    @GET("/albums/{id}")
    suspend fun functionTwo(@Path(value = "id") albumsId:Int): Albums
    

    【讨论】:

    • 非常感谢您的回复。通过提供一些额外的改进,您已经很好地清除了我的查询 ?
    • 但是如果它抛出异常那么如何知道它抛出异常的哪个url?
    最近更新 更多