繁体   English   中英

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

[英]Default/Constant values for POST/PUT arguments with 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允许修改主体..)。

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

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

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/

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM