2016-07-06 5 views
0

Ich versuche, die Retrofit-Bibliothek zu verwenden, damit ich von meiner Android-App aus meine Django-REST-API aufrufen kann, die ich erstellt habe. Ich habe den folgenden Code geschrieben:Warum schlägt meine Retrofit Enqueue fehl?

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 (dies von JSON Pojo generiert wurde)

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; 
    } 

} 

Nun, das ist, wo meine Code schlägt tatsächlich fehl: 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..."); 

        } 
       });      

Ich kann nicht für das Leben von mir denken, warum dies geschieht.

Als Referenz ist das, was die JSON-Datei auf einem Web-Browser an, wenn navigiert aussieht:

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

ich für den großen Textblock entschuldigen, aber ich wusste nicht, wie sonst meine zu erklären, Problem. Jede Hilfe wird sehr geschätzt. Danke

+0

Können Sie die gleiche JSON-Antwort erhalten, wenn Sie den Link von Ihrem Gerät aus aufrufen? – nicobatu

+0

Ja, ich bin. Ich kann zu Beispiel.com/json.json im Browser gehen und das korrekte Ergebnis erhalten – ethanzh

+0

Geht Ihre JSON Antwort immer innerhalb eines Feldes zurück? Ich würde erwarten, dass es ein Objekt ist, genauso wie JsonObject. – nicobatu

Antwort

0

Versuchen Sie, Ihre JsonObject.java Klasse zu etwas anderem umzubenennen.

EDIT

Änderung Ihrer Schnittstelle

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

Um

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

zu überprüfen, ob es funktionieren, wenn Werke, konvertieren Sie dann, dass JSONArray zu JsonObject

innerhalb

die onResponse Methode der api nennen

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

Versucht, dass es auf GeneratedJSON.java refactored und immer noch den gleichen Fehler erhalten – ethanzh

+0

erhalten Sie eine Fehlermeldung? –

+0

Anders als die Fehlermeldung schrieb ich mir selbst, nein. – ethanzh

0

Weil Sie eine Reihe von Nutzern erhalten (obwohl es sieht aus wie es nur ein Element zurückkehrt), dann sollten Sie Ihre Schnittstelle entsprechend ändern:

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

Und so Ihre enqueue() Code:

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..."); 
       } 
      }); 

würde ich die POJO JsonObject zu User oder etwas Sinnvolles wie wel umbenennen l.

Verwandte Themen