我在接口中声明了一个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请求执行此操作,其中信息通过查询字符串传递?
谢谢!
答案 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。