在REST API中验证查询参数

时间:2018-09-13 21:01:19

标签: java rest api-design vert.x

我有一个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.

的SOLID设计原则。

我也从中想到了creating a file and then reading the acceptable params,但这会增加API的响应时间,因为它涉及读取文件。

是否可以通过某种方式保存并读取有效的查询参数,并且不违反设计原则?

1 个答案:

答案 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类,每当添加新参数时,只需扩展枚举,其余所有都会自动扩展,因为这完全取决于枚举中的值。