api接口中参数的约束

时间:2015-11-28 13:40:09

标签: retrofit

我在接口中声明了一个API调用,并且想知道是否可以对某些参数设置约束。我正在访问的API也有这些约束,并希望在我的程序中强制执行它们。

@GET("/recipes/search")
Call<RecipeResponse> getRecipes(
        @Query("cuisine") String cuisine,
        @Query("diet") String diet,
        @Query("excludeIngredients") String excludeIngredients,
        @Query("intolerances") String intolerances,
        @Query("number") Integer number,
        @Query("offset") Integer offset,
        @Query("query") String query,
        @Query("type") String type
);

我该怎么做?

我知道可以通过POST请求执行此操作,并通过RequestBody通过@Body注释传递对象。我是否可以通过GET请求执行此操作,其中信息通过查询字符串传递?

谢谢!

1 个答案:

答案 0 :(得分:0)

我想我最终找到了解决方案。我创建了一个类SearchRecipeRequest,其中我将所有可能的参数声明为类变量。在setter中,我进行数据验证,例如检查所需参数的null,或者对端点指定的整数的最小/最大值约束。然后我创建了一个SearchRecipeRequestBuilder类来构建这样一个对象,以便更容易处理所有这些可能的参数:

public class SearchRecipeRequestBuilder {

    private String  _cuisine = null,
                    _diet = null,
                    _excludeIngredients = null,
                    _intolerances = null,
                    _query = null,
                    _type = null;

    private Integer _number = null,
                    _offset = null;

    public SearchRecipeRequestBuilder() {}

    public SearchRecipeRequest buildRequest() {
        return new SearchRecipeRequest(_cuisine, _diet, _excludeIngredients, _intolerances, _number, _offset, _query, _type);
    }

    public SearchRecipeRequestBuilder cuisine(String cuisine) {
        _cuisine = cuisine;
        return this;
    }

    public SearchRecipeRequestBuilder diet(String diet) {
        _diet = diet;
        return this;
    }

    public SearchRecipeRequestBuilder excludeIngredients(String excludeIngredients) {
        _excludeIngredients = excludeIngredients;
        return this;
    }

    public SearchRecipeRequestBuilder intolerances(String intolerances) {
        _intolerances = intolerances;
        return this;
    }

    public SearchRecipeRequestBuilder query(String query) {
        _query = query;
        return this;
    }

    public SearchRecipeRequestBuilder type(String type) {
        _type = type;
        return this;
    }

    public SearchRecipeRequestBuilder number(Integer number) {
        _number = number;
        return this;
    }

    public SearchRecipeRequestBuilder offset(Integer offset) {
        _offset = offset;
        return this;
    }
}

这允许我像这样构建请求:

    SearchRecipeRequest request = new SearchRecipeRequestBuilder()
            .query("burger")
            .buildRequest();

然后我将该对象传递给另一个知道如何使用请求对象将其传递给API的函数。

这就是我现在正在做的事情,如果有人有更好的方式我会喜欢听到它。 :)

我有一个想法是使用另一个StackOverflow问题中的Builder模式:Managing constructors with many parameters in Java