带有Retrofit的POST / PUT参数的默认值/常量值

时间:2015-06-15 09:58:26

标签: java rest retrofit

使用Square的Retrofit REST Client库,无论如何都要为调用中的POST / PUT字段提供默认/常量值。

我知道通过简单地将它们包含在路径中来包含常量查询参数,但这适用于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不允许修改正文..)。

2 个答案:

答案 0 :(得分:3)

也许一个选项是发送一个对象,它封装了你的所有值,而不是分别包含所有字符串值?该对象将实现您的默认值。

例如,您可以创建一个类:

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;
    }
}

你的班级处理你的常数。您可以将其设置为默认值“常量”,就像我上面所做的那样,或者在构造函数中动态设置它。

现在你所要做的就是用值创建对象并使用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/

答案 1 :(得分:0)

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