【问题标题】:Getting null response when using Retrofit2使用 Retrofit2 时得到空响应
【发布时间】:2020-12-28 12:00:52
【问题描述】:

我正在尝试登录用户,并且我正在使用 Retrofit2 进行网络连接,但我从服务器收到了空响应,尽管我已经在邮递员中测试了 API,它在那里显示响应,但无法在我的应用程序中获取响应。我无法发现此错误的原因。

这是一个 API URL。您可以在 email=digi@gmail.com 和 password=digi1234 处查看回复:

http://www.gurgaonhomeo.in/api_server/login

下面是我的堆栈跟踪:

java.lang.NullPointerException:尝试在空对象引用上调用接口方法“java.lang.Object java.util.List.get(int)”

这是我的 api 响应:

{
"data": [
    {
        "id": "7",
        "username": null,
        "mobile": "1254785698",
        "email": "digi@gmail.com",
        "image": "https://example.com",
        "created_date": "2020-11-06",
        "password": "dasdad324adad245435sffs34535",
        "name": "Digi",
        "address": "Hsbdbshbd",
        "homoeo_practioner": "Yes"
    }
],
"status": true,
"code": 200
}

我用过的这些库:

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0' 

LoginRespose.java

public class LoginResponse {

@Expose
@SerializedName("code")
private String code;

@Expose
@SerializedName("data")
private List<LoginRes> data;

@Expose
@SerializedName("status")
private String status;

public String getCode() {
    return code;
}

public void setCode(String code) {
    this.code = code;
}

public List<LoginRes> getData() {
    return data;
}

public void setData(List<LoginRes> data) {
    this.data = data;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}
}

LoginRes.java

public class LoginRes {

@SerializedName("address")
@Expose
private String address;

@SerializedName("created_date")
@Expose
private String createdDate;

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

@SerializedName("homoeo_practioner")
@Expose
private String homoeoPractioner;

@SerializedName("id")
@Expose
private String id;

@SerializedName("image")
@Expose
private String image;

@SerializedName("mobile")
@Expose
private String mobile;

@SerializedName("name")
@Expose
private String name;

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

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

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getCreatedDate() {
    return createdDate;
}

public void setCreatedDate(String createdDate) {
    this.createdDate = createdDate;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getHomoeoPractioner() {
    return homoeoPractioner;
}

public void setHomoeoPractioner(String homoeoPractioner) {
    this.homoeoPractioner = homoeoPractioner;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getImage() {
    return image;
}

public void setImage(String image) {
    this.image = image;
}

public String getMobile() {
    return mobile;
}

public void setMobile(String mobile) {
    this.mobile = mobile;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}
}

ApiService.java

@POST("login")
@FormUrlEncoded
Call<LoginResponse> logUser(@Field("email") String email,
                            @Field("password") String password);

Login.java

 private void go(String  mail,String pwd){

    Retrofit retrofit = RetrofitClient.getInstance();
    ApiService apiService = retrofit.create(ApiService.class);

    apiService.logUser(mail,pwd).enqueue(new Callback<LoginResponse>() {
        @Override
        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {

            if(response.isSuccessful()){
                prg.dismiss();
               List<LoginRes> res = response.body().getData();
             Toast.makeText(getApplicationContext(),res.get(0).getEmail(),Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<LoginResponse> call, Throwable t) {

            prg.dismiss();
            Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_SHORT).show();
        }
    });
}

为什么我从服务器收到空响应?

【问题讨论】:

  • 您也应该共享基本 URL。这将帮助任何试图为您排除故障的人
  • 我已经发布了网址,请通过它。

标签: java android retrofit2


【解决方案1】:

首先检查 response.body() 是否为空。然后检查 data 内部响应是否为 null 或 []。然后,如果满足了这些要求,那么请拿出清单并展示祝酒词。

【讨论】:

  • 尝试检查您是否在响应中的“数据”字段中获取数据
  • 是的,data 数组中有数据。
  • 我在帖子中添加了 api url 和登录凭据,请检查。
  • 您的 API 返回以下响应 { "status": false, "data": "电子邮件和密码不正确。请再试一次?", "code": 400 }
  • 将电子邮件和密码作为正文表单数据传递。
猜你喜欢
  • 2020-07-22
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2020-11-12
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多