Retrofit 2返回null body

时间:2017-10-20 20:45:21

标签: android rest retrofit2

我正在尝试实现基本练习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());
            }
        });

1 个答案:

答案 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>