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

标签 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);

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

鉴于可以添加 @FormUrlEncoded 来修改正文的编码方式,如果 Retrofit 本身不支持它,是否可以添加我自己的注释并注入(inject)此类默认值? (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,则不会包含在请求正文中。根据上面的两个示例,您现在只需要一个接口(interface)方法。发送哪些值取决于您传递的 createObject。例如,如果您将 otherValue 设置为 null,它将不会成为请求正文的一部分。

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

关于java - 带有 Retrofit 的 POST/PUT 参数的默认/常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30842288/

相关文章:

JavaFX,将 ArrayList 转换为 ObservableList

java - 如何从 log4j2 root logger 获取所有 apender

java - 使用 java eclipse 执行 Jython 脚本

java - Jersey:返回字符串列表

android - 如何在 Retrofit 2 (Android) 中动态设置标题列表

java - JComboBox 像 HTML select 一样提交值

REST API : Best way to do/undo an action on a resource

wordpress - WooCommerce 看不到产品变体

android - 在 Retrofit 中一起使用 @Field 和 @Body 参数

android - Realm + 改造 + Rxjava