发出 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());
}
});
}
我正在使用改装从我的 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());
}
});
}