首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从REST获取响应时使用Retrofit的NullPointer

从REST获取响应时使用Retrofit的NullPointer
EN

Stack Overflow用户
提问于 2018-03-10 01:45:26
回答 4查看 1.8K关注 0票数 2

我正在使用Retrofit与Android上的REST合并,但是我得到了一个错误NullPointerException,如下所示。我尝试使用postman,API运行良好,并得到响应。

ukmutilizer.project.com.ukm_utilizer.model.CheckEmail.getData()‘:尝试在空对象引用上调用虚拟方法的java.util.List java.util.List

这是我的活动课

代码语言:javascript
复制
private void sendRequest(String checkEmail){
    ApiInterface apiService =  ApiClient.getClient().create(ApiInterface.class);

    Call<CheckEmail> call = apiService.getEmailStatus(checkEmail);

    call.enqueue(new Callback<CheckEmail>() {
        @Override
        public void onResponse(Call<CheckEmail> call, Response<CheckEmail> response) {

            CheckEmailData emailDataList = response.body().getData();
            Log.d("Numer of Data : ", String.valueOf(response.body().getData()));

        }

        @Override
        public void onFailure(Call<CheckEmail> call, Throwable t) {
            Toast.makeText(CheckEmailPage.this, "Something went wrong!", Toast.LENGTH_SHORT).show();
            Log.e("Error Retrofit : ", String.valueOf(t));

        }
    });

这是ApiInterface

代码语言:javascript
复制
public interface ApiInterface {
@POST("users/check_status")
Call<CheckEmail> getEmailStatus(@Body String email);
}

这是改造实例

代码语言:javascript
复制
`public class ApiClient {

public static final String BASE_URL = "https://f49d9d29-8471-4126-95b0-1ec3d18eda94.mock.pstmn.io/v1/";
private static Retrofit retrofit = null;

public static Retrofit getClient(){

    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(logging).build();


    if(retrofit == null){
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
   }
}`

这是json的回应

代码语言:javascript
复制
{
"code": 1000,
"message": "OK",
"data": {
    "id": "1",
    "email": "test@gmail.com",
    "status": "1",
    "name": "test",
    "category": "2"
  }
}

这是POJO

代码语言:javascript
复制
`public class CheckEmail {


    @SerializedName("code")
    @Expose
    private Integer code;
    @SerializedName("message")
    @Expose
    private String message;
    @SerializedName("data")
    @Expose
    private CheckEmailData data;

    public Integer getCode() {
        return code;
    }

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

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public CheckEmailData getData() {
        return data;
    }

    public void setData(CheckEmailData data) {
        this.data = data;
    }
}`

CheckEmailData POJO

代码语言:javascript
复制
`public class CheckEmailData {
@SerializedName("id")
@Expose
private String id;

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

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

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

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

public String getId() {
    return id;
}

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

public String getEmail() {
    return email;
}

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

public String getStatus() {
    return status;
}

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

public String getName() {
    return name;
}

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

public String getCategory() {
    return category;
}

public void setCategory(String category) {
    this.category = category;
}

}`
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-10 14:31:23

我已经解决了这个问题

我在界面上添加了标题,如下所示

代码语言:javascript
复制
public interface ApiInterface {
@Headers({
        "Content-Type:application/x-www-form-urlencoded"
})

@POST("v1/users/check_status")
Call<CheckEmail> getEmailStatus(@Body String email);
}
票数 0
EN

Stack Overflow用户

发布于 2018-03-10 02:14:10

从json响应的api中只能得到一个数据,json对象

代码语言:javascript
复制
{
"code": 1000,
"message": "OK",
"data": {
    "id": "1",
    "email": "test@gmail.com",
    "status": "1",
    "name": "test",
    "category": "2"
  }
}

然而,您可以将数据声明为一个List对象,在该对象中,它期望上面的data是一个json数组格式。

您应该将列表更改为

代码语言:javascript
复制
@SerializedName("data")
@Expose
private CheckEmailData data;

我相信会没事的。

票数 1
EN

Stack Overflow用户

发布于 2018-03-10 02:14:26

在那个JSON中,"data“是一个对象,而不是一个数组。在CheckEmail类中,将private List<CheckEmailData> data;更改为private CheckEmailData data;

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49204531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档