我正在使用改造,我需要在对不同api的请求中传递不同的请求数据类。父类会有所不同,但子类在运行时可能会有所不同。
以下是请求的不同示例:
第一个样本
{ “标题”:{ “ version”:“ string”, “ locale”:“ string”, }, “身体”:{ “雇员”:{ “ id”:“字符串”, “ password”:“字符串” } } }
第二个样本
{
“标题”:{
“ version”:“ string”,
“ locale”:“ string”,
},
“身体”:{
“工人”:{
“ name”:“ string”,
“ surname”:“ string”
}
}
}
我创建了不同的标题,正文和用户类,并试图弄清楚如何创建动态请求。
答案 0 :(得分:2)
查看下面的示例如何动态地实现此目标:
首先,我们创建包含RequestHeader
和version
键的locale
类(我已经使用Gson序列化了变量)。
RequestHeader.java
import com.google.gson.annotations.SerializedName;
public class RequestHeader {
@SerializedName("version")
private String version;
@SerializedName("locale")
private String locale;
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getLocale() {
return locale;
}
public void setLocale(String locale) {
this.locale = locale;
}
}
我们拥有可以是任何东西的动态子类,因此我们创建了包含“ body”参数的通用基类,如下所示:
RequestContainer.java
import com.google.gson.annotations.SerializedName;
public class RequestContainer<T> {
@SerializedName("header")
private RequestHeader requestHeader;
@SerializedName("body")
private T body;
public RequestHeader getRequestHeader() {
return requestHeader;
}
public void setRequestHeader(RequestHeader requestHeader) {
this.requestHeader = requestHeader;
}
public T getBody() {
return body;
}
public void setBody(T body) {
this.body = body;
}
}
因此,现在我们可以在所需的运行时获取任何动态子代。
提供API端点类似于(即Employee):
@POST("someapi")
public Call<SomeResponseClass> saveEmployee(@Body RequestContainer<EmployeeDto>);
EmployeeDto
如下所示:
EmployeeDto.java
import com.google.gson.annotations.SerializedName;
public class EmployeeDto {
@SerializedName("employee")
private Employee employee;
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public class Employee {
@SerializedName("id")
private String id;
@SerializedName("password")
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
}