2016-07-06 27 views
0

我想使用Retrofit庫,這樣我就可以從我的Android應用程序調用我創建的Django REST API。我有以下的代碼寫成:爲什麼我的改造入隊失敗?

UserAPI.java

public interface UserAPI { 

    String BASE_URL = "http://www.example.com"; 


    @GET("/json.json") 
    Call<JsonObject> getUsers(); 


    class Factory { 

     private static UserAPI service; 

     public static UserAPI getInstance(){ 

      if(service == null){ 

       Retrofit retrofit = new Retrofit.Builder() 
         .addConverterFactory(GsonConverterFactory.create()) 
         .baseUrl(BASE_URL) 
         .build(); 

       service = retrofit.create(UserAPI.class); 
       return service; 
      } 

      else{ 
       return service; 
      } 

     } 

    } 

} 

JsonObject.java(這是從JSON生成POJO)

public class JsonObject { 

    @SerializedName("username") 
    @Expose 
    private String username; 
    @SerializedName("password") 
    @Expose 
    private String password; 
    @SerializedName("email") 
    @Expose 
    private String email; 

    /** 
    * 
    * @return 
    *  The username 
    */ 
    public String getUsername() { 
     return username; 
    } 

    /** 
    * 
    * @param username 
    *  The username 
    */ 
    public void setUsername(String username) { 
     this.username = username; 
    } 

    /** 
    * 
    * @return 
    *  The password 
    */ 
    public String getPassword() { 
     return password; 
    } 

    /** 
    * 
    * @param password 
    *  The password 
    */ 
    public void setPassword(String password) { 
     this.password = password; 
    } 

    /** 
    * 
    * @return 
    *  The email 
    */ 
    public String getEmail() { 
     return email; 
    } 

    /** 
    * 
    * @param email 
    *  The email 
    */ 
    public void setEmail(String email) { 
     this.email = email; 
    } 

} 

現在,這是我的代碼實際上失敗: MainActivity.java

UserAPI.Factory.getInstance().getUsers().enqueue(new Callback<JsonObject>() { 
        @Override 
        public void onResponse(Call<JsonObject> call, Response<JsonObject> response) { 

         Log.wtf("Response", "" + response.body()); 

        } 

        @Override 
        public void onFailure(Call<JsonObject> call, Throwable t) { 
         Log.wtf("FAIL", "This failed..."); 

        } 
       });      

我不知道爲什麼會出現這種情況。

以供參考,這是JSON文件看起來,當瀏覽到一個網頁瀏覽器在:

[{"username":"testuser","password":"pbkdf2_sha256$24000$9YMUYsV7WuIa$FnokGg8jFlAq3LHGBXgqVHNUnLCQa7pj5ehhWKvNkuU=","email":""}] 

我的文字塊巨大道歉,但我不知道該怎麼解釋我問題。任何幫助將不勝感激。謝謝

+0

如果您通過設備訪問鏈接,是否可以獲得相同的JSON響應? – nicobatu

+0

是的,我是。我可以在瀏覽器中訪問example.com/json.json並獲得正確的結果 – ethanzh

+0

您的JSON響應是否總是在數組內返回?我希望它是一個對象,JsonObject也是如此。 – nicobatu

回答

0

嘗試將您的JsonObject.java類重命名爲其他內容。

編輯

改變你的接口

@GET("/json.json") 
Call<JsonObject> getUsers(); 

@GET("/json.json") 
Call<JSONArray> getUsers(); 

檢查,如果它工作,如果作品,然後將其轉換你JSONArray到JSONObject的

內您的API的方法調用

Log.wtf("Response", "" + response.body().getJSONObject(0)); 
+0

試過,重構它到GeneratedJSON.java,仍然得到相同的錯誤 – ethanzh

+0

你是否收到任何錯誤消息? –

+0

除了我自己寫的錯誤信息外,沒有。 – ethanzh

0

因爲您收到的用戶(即使它看起來是隻返回一個元素)的數組,你應該相應地改變你的接口:

@GET("/json.json") 
Call<List<JsonObject>> getUsers(); 

而且所以你enqueue()代碼:

UserAPI.Factory.getInstance().getUsers().enqueue(new Callback<List<JsonObject>>() { 
       @Override 
       public void onResponse(Call<List<JsonObject>> call, Response<List<JsonObject>> response) { 
        for (JsonObject user : response.body()) { 
         Log.wtf("Response", "" + user.getUsername()); 
        } 
       } 

       @Override 
       public void onFailure(Call<List<JsonObject>> call, Throwable t) { 
        Log.wtf("FAIL", "This failed..."); 
       } 
      }); 

我的POJO JsonObject重命名爲User或有意義的WEL湖