无法使用改装调用GItHub搜索用户API



我正在试用GitHub搜索用户API。我的目标是编写一个简单的应用程序:键入用户名,任何与之相关的GitHub用户名都将显示在RecyclerView上(使用MVVM模式(。

例如,以下是如何搜索用户名clive:

https://api.github.com/search/users?q=clive

以下是相关部分的代码:

APIConfig.java

public class APIConfig {
public static final String BASE_URL = "https://api.github.com";
public static final String END_POINT_SEARCH_USERS = "/search/users";
}

APIEndPoint.java

import com.divbyzero.app.githubusersearch.model.User;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface APIEndPoint {
@GET(APIConfig.END_POINT_SEARCH_USERS)
Call<List<User>> getSearchResult(@Query("q") String param);
}

User.java

package com.divbyzero.app.githubusersearch.model;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class User {
@SerializedName("login")
@Expose
private String login;
@SerializedName("avatar_url")
@Expose
private String avatar_url;
public void setLogin(String login){
this.login = login;
}
public void setAvatarUrl(String url){
this.avatar_url = url;
}
public String getLogin(){
return login;
}
public String getAvatarUrl(){
return avatar_url;
}
public User(String login, String url){
this.login = login;
this.avatar_url = url;
}
}

UserViewModel.java

package com.divbyzero.app.githubusersearch.viewmodel;
import android.util.Log;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.divbyzero.app.githubusersearch.api.APIEndPoint;
import com.divbyzero.app.githubusersearch.api.APIService;
import com.divbyzero.app.githubusersearch.model.User;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class UserViewModel extends ViewModel {
private MutableLiveData<ArrayList<User>> mutableLiveData = new MutableLiveData<>();
public void setSearchResult(String param){
Retrofit retrofit = APIService.getRetrofitService();
APIEndPoint apiEndpoint = retrofit.create(APIEndPoint.class);
Call<List<User>> call = apiEndpoint.getSearchResult(param);
call.enqueue(new Callback<List<User>>() {
@Override
public void onResponse(Call<List<User>> call, Response<List<User>> response) {
mutableLiveData.setValue((ArrayList<User>) response.body());
Log.d("DBG", "OK");
}
@Override
public void onFailure(Call<List<User>> call, Throwable t) {
Log.d("DBG", "Failed");
}
});
}
public LiveData<ArrayList<User>> getSearchResult(){
return mutableLiveData;
}
}

完整源代码:https://github.com/anta40/GithubUserSearch

当我在SearchView上键入任何用户名并按ENTER键时,不会显示任何搜索结果(recyclerview仍然为空(。经过进一步检查,我发现logcat上显示了"DBG:Failed",这意味着没有正确调用GitHub API。如何解决此问题?

错误

出现在视图模型中的错误是:

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

因此,解析响应时出现了问题。您正在接收它,但解析错误。

原因

调用此GET请求(您正在使用(后:

https://api.github.com/search/users?q=some_name

我正在接收:

{
"total_count": 0,
"incomplete_results": false,
"items": [
]
}

哪里有问题

在接收.json的基础上,我看到作为根元素的是JSON OBJECT。在ViewModel中,您期望的是List<User>(JSON ARRAY(,但这不是真的。您正在接收具有3个字段的对象。其中一个字段是您的List<User>

修复-描述

您必须创建新的模型类来描述您正在接收的数据。要解析(从json到Java(所有接收到的数据,它应该包含3个字段。

修复-代码

你的新课程示例:

public class GitHubResponse {
private long totalCount;
private boolean incompleteResults;
private List<User> items;
}

并在ViewModel和CCD_ 4中使用此类eveywhere。访问这个类的数据获取程序。

一般项目提示

  • 重新格式化代码(Ctrl+Alt+L

  • 添加";"开始";状态(因为启动应用程序视图后为空(

  • 添加空状态(当接收到的数据为空时(

  • 添加加载状态(当您正在加载数据并等待响应时(

  • 添加错误状态(当连接失败或解析数据出现问题时(

相关内容

  • 没有找到相关文章