使用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
不允许修改正文..)。
答案 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作为第二个参数吗?然后,如果该参数不存在,你可以忽略它