2017-10-20 110 views
0

我想實現基本的練習Retrofits顯示:對github API進行簡單的查詢。我試圖得到一個Repository的列表,但是雖然結果的狀態是200,但是它的主體是空的。 github上有一些門票抱怨同樣的問題,它看起來可能來自json轉換器。我使用gson。但我無法發現它的代碼是罪魁禍首...Retrofit 2返回null body

這裏是我的依賴關係:

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("https://stackoverflow.com/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

你嘗試使用註釋@expose和@您的POJO – SAM

+0

上的SerializedName(「field_name」)是否使用github v3 apis? Everting從你的結局看起來不錯 –

回答

0

我在我的瀏覽器訪問https://api.github.com/search/repositories?q=threetenabp,我看到一個不同的JSON結構似乎比你期待:

{ 
    "total_count": 4, 
    "incomplete_results": false, 
    "items": [ 
    { 
     "id": 38503932, 
     "name": "ThreeTenABP", 
     ... 
    }, 
    { 
     "id": 61799973, 
     "name": "ThreeTenABPSample", 
     ... 
    }, 
    { 
     "id": 78114982, 
     "name": "TwitterPack", 
     ... 
    }, 
    { 
     "id": 76958361, 
     "name": "ZonedDateTimeProguardBug", 
     ... 
    } 
    ] 
} 

在代碼中,我看到這個電話:

@GET("/search/repositories") 
Call<List<Repository>> getByKeywords(@Query("q") String q); 

這工作,如果收到的JSON響應中的結構是這樣的:

[ 
    { "id": ... }, 
    { "id": ... } 
] 

換句話說,在現實JSON響應, "items"字段是您稱爲List<Repository>的字段,但您需要一些東西來表示頂級響應對象。

我會創造這樣一個新的類:

public class GithubResponse { 

    private int total_count; 
    private boolean incomplete_results; 
    private List<Repository> items; 
} 

然後,我會改變你的客戶端界面此電話:

@GET("/search/repositories") 
Call<GithubResponse> getByKeywords(@Query("q") String q); 
+0

謝謝你糾正了「get by keyword」部分。但「獲取用戶名」部分仍返回空體。當我測試https://api.github.com/users/test/repos時,它直接返回一個數組。所以我看不出這個錯誤在哪裏...... – CodingMouse