创建具有不同请求类型的请求数据类

时间:2019-12-02 08:28:33

标签: java android json request retrofit

我正在使用改造,我需要在对不同api的请求中传递不同的请求数据类。父类会有所不同,但子类在运行时可能会有所不同。

以下是请求的不同示例:

  • 第一个样本

    {    “标题”:{       “ version”:“ string”,       “ locale”:“ string”,    },    “身体”:{       “雇员”:{          “ id”:“字符串”,          “ password”:“字符串”       }    } }

  • 第二个样本

    {    “标题”:{       “ version”:“ string”,       “ locale”:“ string”,    },    “身体”:{
          “工人”:{          “ name”:“ string”,          “ surname”:“ string”       }    } }

我创建了不同的标题,正文和用户类,并试图弄清楚如何创建动态请求。

1 个答案:

答案 0 :(得分:2)

查看下面的示例如何动态地实现此目标:

首先,我们创建包含RequestHeaderversion键的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;
        }
    }
}