我有一个REST API,可以接受查询参数。 The query parameters are valid if and only if at a time only one query parameter is passed and it is among the list of valid query parameters.
目前我对此的逻辑是:
我正在收集地图中的查询参数。然后检查它的大小。如果size> 1函数抛出错误。如果不是这种情况,则遍历映射,如果找到有效参数以外的参数,该函数将引发错误。
例如:
if(queryParam.size()>1) {
throw new FailureResponse();
}
queryParam.forEach(e->{
String key = e.getKey();
if(!key.equalsIgnoreCase("p1") && !key.equalsIgnoreCase("p2")) {
throw new FailureResponse();
}
});
但是我认为这种方式违反了a class should be open for extension but closed for modification.
我也从中想到了creating a file and then reading the acceptable params
,但这会增加API的响应时间,因为它涉及读取文件。
是否可以通过某种方式保存并读取有效的查询参数,并且不违反设计原则?
答案 0 :(得分:2)
您可以维护有效参数的枚举,并在适用时扩展枚举,例如
public enum QueryParams{
PARAM_1("param1"),
PARAM_2("param2"),
private String paramValue;
QueryParams(String paramName){
this.paramValue = paramValue();
}
public void getParamValue(){
return this.value;
}
}
然后您可以遍历此枚举的值集以过滤掉无效值
List<String> validParams = Arrays.asList(QueryParams.values()).stream().map(QueryParams::getParamValue).collect(Collectors.toList());
queryParams.removeAll(validParams);
if(queryParams.size()!=0) {
throw new FailureResponse();
}
}
这有助于您无需更改就可以维护API类,每当添加新参数时,只需扩展枚举,其余所有都会自动扩展,因为这完全取决于枚举中的值。