Default/Constant POST/PUT 个参数的值与 Retrofit

Default/Constant values for POST/PUT arguments with Retrofit

使用 Square 的 Retrofit REST Client 库,是否可以在调用中为 POST/PUT 字段提供 default/constant 值。

我知道通过简单地将它们包含在路径中来包含常量查询参数,但这适用于 Body 参数。

我有一个 API 看起来类似于:

POST /api/create
type=constanta&value={value}

POST /api/create
type=constantb&value={value}&otherValue={otherValue}

其中第二个变体需要提供额外的参数。我希望能够从方法调用中删除常量,而不是让一个 java 方法接受所有三个参数,例如:

create(String value);
create(String value, String otherValue);

并进行改造注入类型参数常量。

鉴于可以添加 @FormUrlEncoded 来修改正文的编码方式,如果 Retrofit 本身不支持它,是否可以添加我自己的注释并注入此类默认值? (似乎 RequestInterceptor 不允许修改正文..)。

您可以使用 Guava 或 Java 8 Optional 作为方法中的第二个参数吗?然后,如果该参数不存在,您可以忽略它

也许一种选择是发送一个对象,它封装了您的所有值,而不是单独封装所有字符串值?该对象将实现您的默认值。

例如,您可以创建 class:

public class CreateObject {
    private String type = "constant";
    private String value;
    private String otherValue;

    public CreateObject(String value, String otherValue) {
        this.value = value;
        this.otherValue = otherValue;
    }
}

您的 class 处理您的常量。您可以像我上面那样将它设置为默认值 "constant",或者在构造函数中即时设置它。

现在您要做的就是使用这些值创建对象并使用 Retrofit 发出请求。不要直接使用字符串值,只需传递对象即可。您的界面可能如下所示:

public interface CreateService {
    @POST("/api/create")
    void create(@Body CreateObject create, Callback<CreateObject> cb);
}

这样的请求实现:

CreateObject create = new CreateObject("value", "otherValue");
createService.create(create, new Callback<CreateObject)() {…});

这应该包括请求正文中的所有三个值(如果已设置)。如果值为 null,则不会包含在请求正文中。根据上面的两个示例,您现在只需要一个接口方法。发送哪些值取决于您传递的 createObject。例如,如果您将 otherValue 设置为 null,它将不会成为请求正文的一部分。

我的示例修改自:https://futurestud.io/blog/retrofit-send-objects-in-request-body/