Проверка параметров запроса в REST API - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть 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.

В настоящее время моя логика для этого такова:

Я собираю параметры запроса на карте. А потом проверил его размер. Если размер> 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();
        }

    });

Но я думаю, что таким образом я нарушаю принцип разработки SOLID, который гласит: a class should be open for extension but closed for modification.

Я также подумал о creating a file and then reading the acceptable params из этого, но это добавило бы к времени отклика API, поскольку это включает чтение файла.

Есть ли способ сохранить и прочитать действительные параметры запроса, и это не нарушает принципы разработки?

1 Ответ

0 голосов
/ 14 сентября 2018

Вы можете поддерживать Enum действительных параметров и расширять перечисления, как и когда это применимо, например

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 без каких-либо изменений; всякий раз, когда добавляется новый параметр, просто расширяйте перечисление, а все остальное автоматически расширяется, поскольку все зависит от значения в перечислении.

...