我正在尝试实现基本练习Retrofits显示:对github API进行简单的获取查询。我想获取一个Repository列表,但是虽然结果的状态是200,但是body是null。 github上有一些票据抱怨同样的问题,看起来它可能来自json转换器。我用gson。但我没有发现哪个代码是罪魁祸首......
以下是我的依赖项:
dependencies {
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
存储库POJO:
public class Repository {
private int id;
private String name;
private String full_name;
private String html_url;
// getters + setters + toString
}
客户端界面:
public interface GithubClient {
public static final String ENDPOINT = "https://api.github.com";
@GET("/users/{user}/repos")
Call<List<Repository>> getByUser(@Path("user") String user);
@GET("/search/repositories")
Call<List<Repository>> getByKeywords(@Query("q") String q);
}
如何初始化:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(GithubClient.ENDPOINT)
.addConverterFactory(GsonConverterFactory.create())
.build();
githubClient = retrofit.create(GithubClient.class);
请求执行:
Call<List<Repository>> request = githubClient.getByUser(inputText);
request.enqueue(new Callback<List<Repository>>() {
@Override
public void onResponse(Call<List<Repository>> call, Response<List<Repository>> response) {
progress.setVisibility(View.GONE);
results.setText(response.toString());
}
@Override
public void onFailure(Call<List<Repository>> call, Throwable t) {
progress.setVisibility(View.GONE);
results.setText(t.getMessage());
}
});
答案 0 :(得分:0)
我在浏览器中访问了https://api.github.com/search/repositories?q=threetenabp,看到的JSON结构与您期望的结果不同:
modal-cancel
在你的代码中,我看到了这个电话:
var cancel = document.getElementById('modal-cancel');
var close = document.getElementById('modal-close');
cancel.onclick = function () {
//close window
}
close.onlick = function () {
//close window
}
如果收到的JSON响应结构如下:
,这将有效{
"total_count": 4,
"incomplete_results": false,
"items": [
{
"id": 38503932,
"name": "ThreeTenABP",
...
},
{
"id": 61799973,
"name": "ThreeTenABPSample",
...
},
{
"id": 78114982,
"name": "TwitterPack",
...
},
{
"id": 76958361,
"name": "ZonedDateTimeProguardBug",
...
}
]
}
换句话说,在真正的JSON响应中,@GET("/search/repositories")
Call<List<Repository>> getByKeywords(@Query("q") String q);
字段就是您所谓的[
{ "id": ... },
{ "id": ... }
]
字段,但您需要一些东西来表示顶级响应对象。
我会创建一个像这样的新类:
"items"
然后我会将您的客户端界面中的调用更改为:
List<Repository>