[英]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.