发出 GET 请求时改造 returns 空响应体

Retrofit returns null response body when issuing a GET request

我正在使用改装从我的 API 接收 JSON 数据。当数据包含单个对象时,我能够接收 JSON 数据。但是当我尝试获取所有员工的列表时出现错误。

JSON /api/Employee/1 的数据是(工作正常):

{
  "id": 10,
  "name": "Arpit",
  "number": "7777777777",
  "city": "noida",
  "depid": 4,
}

获取此 JSON 对象的代码正在运行。 PFB代码。

改装代码:

public void onResponse(Response<EmployeeResponse> response, Retrofit retrofit) {
    if (response.raw().toString()!=null) {
        Employee e = new Employee();
        e.setId(response.body().id);
        e.setName(response.body().name);
        e.setCity(response.body().city);
        e.setNumber(response.body().number);
        Log.d("employee details", e.toString());
        list.add(e);
        rv.setAdapter(new SimpleItemRecyclerViewAdapter(list));
    }
    else
        Log.d("No data recieved",response.raw().toString());
}

@Override
public void onFailure(Throwable t) {
    Log.d("Fail",t.getMessage());}

EmployeeAPI.java

public interface EmployeeAPI {
@GET("/assignment1/api/Employee/1")
Call<EmployeeResponse> load_employee();}

EmployeeResponse.java

public class EmployeeResponse {
@SerializedName("id")
public String id;
@SerializedName("name")
public String name;
@SerializedName("city")
public String city;
@SerializedName("number")
public String number;}

但是当我试图从 /api/Employee 获取所有员工的列表时,我收到以下错误:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

JSON api/Employee 的数据是 ():

[  
   {  
  "id":10,
  "name":"Arpit Jain",
  "number":"7777777777",
  "city":"noida",
  "depid":4,
   },
   {  
  "id":32,
  "name":"Ish Chawla",
  "number":"9999999999",
  "city":"Noida",
  "depid":1,
   },
   {  
  "id":39,
  "name":"Laxman",
  "number":"6666666666",
  "city":"GZB",
  "depid":1,
   },
   {  
  "id":44,
  "name":"Ishan",
  "number":"9839060055",
  "city":"Kanpur",
  "depid":3,
   }
]

获取员工列表的代码是:

改造代码

public void onResponse(Response<EmployeeResponse> response, Retrofit retrofit) {
    if (response.raw().toString()!=null) {
        Log.d("employee details", response.body().toString());
        list = response.body().list;
        rv.setAdapter(new SimpleItemRecyclerViewAdapter(list));
    }
    else
        Log.d("No data recieved",response.raw().toString());
}

@Override
public void onFailure(Throwable t) {
    Log.d("Fail",t.getMessage());
}

EmployeeAPI.java

 public interface EmployeeAPI {
    @GET("/assignment1/api/Employee")
    Call<EmployeeResponse> load_employee();
}

EmployeeResponse.java

   public class EmployeeResponse {
    public ArrayList<Employee> list;
}

请告诉我正确获取数据所需的更改。

public class EmployeeResponse {
   @SerializedName("id") 
   public String id; 
   @SerializedName("name")
   public String name;
   @SerializedName("city")
   public String city;
   @SerializedName("number")
   public String number;
}

利用以上class作为模型

public interface EmployeeAPI {
  @GET("/assignment1/api/Employee")
  Call<ArrayList<EmployeeResponse>> load_employee();
}

并且由于您 return 列表使调用对象接受列表以接受员工列表

这是因为您正在获取整个员工列表及其数组。

  public interface EmployeeAPI {
     @GET("/assignment1/api/Employee")
     Call<Employee[]> load_employee();

     @GET("/assignment1/api/Employee/1")
     Call<Employee> load_employee();
    }

并且不要创建 EmployeeResponse class。在 Employee pojo class 中使用 @SerializedName。

收到回复后

if (response.raw().toString()!=null) {
        Employee e = new Employee();
        e.setId(response.body().id);
        e.setName(response.body().name);
        e.setCity(response.body().city);
        e.setNumber(response.body().number);
        Log.d("employee details", e.toString());
        list.add(e);
        rv.setAdapter(new SimpleItemRecyclerViewAdapter(list));
    }

不需要设置这个。

您需要对代码进行少量更改:

1)EmployeeResponse.java

public class EmployeeResponse {
    public List<Employee> list;

      public List<Employee> getDatas() {
        return datas;
    }
  }

2) Employee.java

  public class Employee{
       @SerializedName("id") 
       public String id; 
       @SerializedName("name")
       public String name;
       @SerializedName("city")
       public String city;
       @SerializedName("number")
       public String number;

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    }

3) 在接口中:

public interface EmployeeAPI {
  @GET("/assignment1/api/Employee")
  Call<EmployeeResponse> load_employee();
}

4) 改造代码

 private void getEmployee() {
List<Employee> employee;
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        EmployeeAPI apiInterface = retrofit.create(EmployeeAPI.class);
        Call<EmployeeResponse> call = apiInterface.load_employee();
        call.enqueue(new Callback<EmployeeResponse>() {
            @Override
            public void onResponse(Call<EmployeeResponse> call, Response<EmployeeResponse> response) {
       employee = response.body().getDatas();
            }
            @Override
            public void onFailure(Call<EmployeeResponse> call, Throwable t) {
                Log.e(TAG, "onFailure:" + t.getMessage());
            }
        });
    }