【问题标题】:Cannot fetch Retrofit 2 response body无法获取 Retrofit 2 响应正文
【发布时间】:2016-07-24 15:06:35
【问题描述】:

我有一个带有 mongo、express 和 node 的服务器 我试图在这里通过用户名获取用户数据: myip/users/name/example_name

example_name 是一个参数。

这是我的代码:

主要活动:

@BindView(R.id.btnTest)
Button btnTest;
@BindView(R.id.tvTest)
TextView tvTest;

@OnClick(R.id.btnTest) void changeText(){
    GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
    final Call<User> call =
            gitHubService.getUser("dolev");

    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            Toast.makeText(MainActivity.this,"This: " +  response.body().getName(), Toast.LENGTH_SHORT).show();
            tvTest.setText("response success," + response.body().toString());
        }
        @Override
        public void onFailure(Call<User> call, Throwable t) {
            tvTest.setText("Something went wrong: " + t.getMessage());
        }
    });
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

}

@Override
public void onResponse(Call<User> call, Response<User> response) {
    int code = response.code();
    if (code == 200) {
        User user = response.body();
        Log.v("FETCH", response.body().getEmail());
        Toast.makeText(this, "Got the user: " + user.getName(), Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(this, "Did not work: " + String.valueOf(code), Toast.LENGTH_LONG).show();
    }
}

@Override
public void onFailure(Call<User> call, Throwable t) {
    Toast.makeText(this, "Nope", Toast.LENGTH_LONG).show();

}

GitHub服务:

public interface GitHubService {



@GET("users/name/{username}")
Call<User> getUser(@Path("username") String username);

@GET("users}")
Call<List<User>> getAllUsers();





public static final Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(Global.API)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

}

用户类别:

package com.noy.photobomb.model;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Generated;

@Generated("org.jsonschema2pojo")
public class User {


    @SerializedName("_id")
    @Expose
    private String id;
    @SerializedName("isBanned")
    @Expose
    private Boolean isBanned;
    @SerializedName("users_followers")
    @Expose
    private List<Object> usersFollowers = new ArrayList<Object>();
    @SerializedName("__v")
    @Expose
    private Integer v;
    @SerializedName("followers")
    @Expose
    private List<Object> followers = new ArrayList<Object>();
    @SerializedName("groups")
    @Expose
    private List<Object> groups = new ArrayList<Object>();
    @SerializedName("phoneNumber")
    @Expose
    private String phoneNumber;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("email")
    @Expose
    private String email;


    private String login;

    public String getLogin() {
        return login;
    }
    /**
     *
     * @return
     * The id
     */
    public String getId() {
        return id;
    }

    /**
     *
     * @param id
     * The _id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     *
     * @return
     * The isBanned
     */
    public Boolean getIsBanned() {
        return isBanned;
    }

    /**
     *
     * @param isBanned
     * The isBanned
     */
    public void setIsBanned(Boolean isBanned) {
        this.isBanned = isBanned;
    }

    /**
     *
     * @return
     * The usersFollowers
     */
    public List<Object> getUsersFollowers() {
        return usersFollowers;
    }

    /**
     *
     * @param usersFollowers
     * The users_followers
     */
    public void setUsersFollowers(List<Object> usersFollowers) {
        this.usersFollowers = usersFollowers;
    }

    /**
     *
     * @return
     * The v
     */
    public Integer getV() {
        return v;
    }

    /**
     *
     * @param v
     * The __v
     */
    public void setV(Integer v) {
        this.v = v;
    }

    /**
     *
     * @return
     * The followers
     */
    public List<Object> getFollowers() {
        return followers;
    }

    /**
     *
     * @param followers
     * The followers
     */
    public void setFollowers(List<Object> followers) {
        this.followers = followers;
    }

    /**
     *
     * @return
     * The groups
     */
    public List<Object> getGroups() {
        return groups;
    }

    /**
     *
     * @param groups
     * The groups
     */
    public void setGroups(List<Object> groups) {
        this.groups = groups;
    }

    /**
     *
     * @return
     * The phoneNumber
     */
    public String getPhoneNumber() {
        return phoneNumber;
    }

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

    /**
     *
     * @return
     * The name
     */
    public String getName() {
        return name;
    }

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

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

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

}

当我尝试获取 JSON 数据时 - 响应正文为空 - 例如名称、ID、电子邮件等。 response.body().toString() 给了我一个结果: @59285 而且数字变了。。 我的意思是,我得到了身体 com.noy.photobomb.model.User@84593 类 @ 之后的数字在每次单击按钮时都会发生变化。 我从早上开始就在研究它,我搜索了 StackOverFlow 的许多教程和错误,但我没有发现这样的错误。 有人可以帮帮我吗?

【问题讨论】:

  • 什么是状态码?
  • 调试时,如果你的意思是body中的代码,那么它的200
  • 你能发布你的 JSON 响应吗?
  • {"error":false,"message":[{"_id":"579488399c56291778d9e4e6","isBanned":false,"password":"pass","name":"dolev" ,"email":"mail@gmail.com","__v":0,"followers":[],"groups":[]}]}
  • 您必须首先获取message 数组作为响应。所以你必须为此创建 2 个 POJO

标签: java android client-server retrofit


【解决方案1】:

@Sagar Jogadia 通过聊天帮助我弄清楚了。 问题是数据在 JSON 数组中,我试图获取一个对象,所以我使用用户列表而不是用户。我通过 body 获取数据,然后它是一个具有一个索引的数组 - response.body.get(0).getName() - 例如。 非常感谢

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 2016-11-18
    • 2020-05-09
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2015-10-23
    相关资源
    最近更新 更多