为什么我的Retrofit Enqueue失败?

时间:2016-07-06 21:25:48

标签: android json retrofit retrofit2

我正在尝试使用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文件在Web浏览器上导航时所看到的内容:

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

我为大量的文字道歉,但我不知道如何解释我的问题。任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:0)

尝试将您的JsonObject.java课程重命名为其他内容。

修改

更改您的界面

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

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

检查,如果有效,如果有效,则将JSONArray转换为JsonObject

在你的api通话的onResponse方法中

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

答案 1 :(得分: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或其他有意义的内容。