2016-08-25 5 views
3

Я хотел бы подтвердить запрос таким образом, чтобы были приняты только конкретные поля запроса и вернуть 400 для всех непринятых полей с помощью Dropwizard и Jersey.Реализация сильных параметров с помощью Dropwizard

Есть ли все равно для этого?

РЕДАКТИРОВАТЬ:

Пример - Давайте предположим, что запрос содержит следующую JSON: { имя: Тест, возраст: 30, ID: 52 }

и поле ID не принято в запросе сервера.

Ожидается: сервер должен вернуть 400, указав, что идентификатор поля не разрешен в запросе.

ответ

0

Вторая попытка ответить на этот вопрос после того, как был изменен вопрос.

Вы можете создать свой JSON-компонент и игнорировать неизвестные значения, такие как ID с аннотацией Джексона «JsonIgnoreProperties».

Вы следующий ресурс:

@Post 
public Response hello(Person person) { 
     return Response 
       .status(Status.OK) 
       .entity(String.format("Hello %s. We know that you are %s years old, but we do not know if you send more informations to us like id or sth. else.", person.getName(), person.getAge())) 
       .build(); 
} 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Person { 
    private final String name; 
    private final int age; 

    @JsonCreator 
    public Person(@JsonProperty String name,@JsonProperty int age) { 
     this.name= name; 
     this.age= age; 
    } 

    @JsonProperty 
    public String getName() { 
     return name; 
    } 

    @JsonProperty 
    public String getage() { 
     return age; 
    } 
} 

Старый Ответ:

Почему бы не проверять их? Ниже приведен пример того, как это сделать.

Вариант 1:

@Path("smooth") 
@GET 
public Response smooth(
    @DefaultValue("2") @QueryParam("step") int step, 
    @DefaultValue("true") @QueryParam("min-m") boolean hasMin, 
    @DefaultValue("true") @QueryParam("max-m") boolean hasMax, 
    @DefaultValue("true") @QueryParam("last-m") boolean hasLast, 
    @DefaultValue("blue") @QueryParam("min-color") ColorParam minColor, 
    @DefaultValue("green") @QueryParam("max-color") ColorParam maxColor, 
    @DefaultValue("red") @QueryParam("last-color") ColorParam lastColor) { 
    validateMaxColor(maxColor); 
} 

public void validateMaxColor(ColorParam maxColorParam){ 
    if(!maxColorParam.isInRange()){ 
     throw new WebapplicationException("maxColorParam out of range"); 
    } 
} 

Вариант 2: Используйте определенный класс парам

@Path("smooth") 
@GET 
public Response smooth(
    @DefaultValue("2") @QueryParam("step") int step, 
    @DefaultValue("true") @QueryParam("min-m") boolean hasMin, 
    @DefaultValue("true") @QueryParam("max-m") boolean hasMax, 
    @DefaultValue("true") @QueryParam("last-m") boolean hasLast, 
    @DefaultValue("blue") @QueryParam("min-color") ColorParam minColor, 
    @DefaultValue("green") @QueryParam("max-color") ColorParam maxColor, 
    @DefaultValue("red") @QueryParam("last-color") ColorParam lastColor) { 
    .... 
} 


public class ColorParam extends Color { 

    public ColorParam(String color) { 
     super(getRGB(color)); 
     if(getRGB(color).isGreen()){ 
      throw new ParseException("ohh nooooo ... green is not allowed here"); 
     } 
    } 

    private static int getRGB(String s) { 
     if (s.charAt(0) == '#') { 
      try { 
       Color c = Color.decode("0x" + s.substring(1)); 
       return c.getRGB(); 
      } catch (NumberFormatException e) { 
       throw new WebApplicationException(400); 
      } 
     } else { 
      try { 
       Field f = Color.class.getField(s); 
       return ((Color)f.get(null)).getRGB(); 
      } catch (Exception e) { 
       throw new WebApplicationException(400); 
      } 
     } 
    } 
} 

Здесь важно, что вы используете конструктор String.

Вариант 3: для пользователей Dropwizard; Используйте AbstractParam и проверять входящую строку

См Dropwizard documentation about Params:

Параметры

аннотированных методов классов ресурсов могут принимать параметры, которые сопоставленные с из аспектов входящего запроса. Аннотации * Param определяют, какая часть запроса сопоставлена ​​данными, и тип параметра определяет способ отображения данных.

Например:

A @PathParam("user")-annotated String takes the raw value from the user variable in the matched URI template and passes it into the 

метод в виде строки. Параметр @QueryParam («count») - аннотированный параметр IntParam принимает первое значение счетчика из строки запроса запроса и передает его как конструктор String в конструкцию IntParam как . IntParam (и все остальные классы io.dropwizard.jersey.params. *) Анализирует строку как Целое число, возвращая 400 Bad Request, если значение искажено. A @FormParam («имя») - аннотированный параметр Set принимает все значения имен из опубликованной формы и передает их методу в виде набора строк . A * Параметр-аннотированный NonEmptyStringParam будет интерпретировать пустые строки как отсутствующие строки, что полезно в случаях, когда конечная точка обрабатывает пустые строки и отсутствующие строки как взаимозаменяемые.

Что примечательно, так это то, что вы можете фактически инкапсулировать большую часть вашей логики проверки с помощью специализированных объектов параметров. См. AbstractParam для деталей.

Ваш ресурс должен получить что-то вроде этого:

@Path("long") 
@GET 
public Response long(
    @QueryParam("long") LongParam longValue) { 
    //here your longValue is in wanted Range 
    //doubles or floats will return a HTTP 400 
} 


/** 
* A parameter encapsulating long values. All non-decimal values will return a {@code 400 Bad 
* Request} response. 
*/ 
public class LongParam extends AbstractParam<Long> { 
    public LongParam(String input) { 
     super(input); 
    } 

    @Override 
    protected String errorMessage(Exception e) { 
     return "Parameter is not a number."; 
    } 

    @Override 
    protected Long parse(String input) { 
     return Long.valueOf(input); 
    } 
} 

С этим вы можете легко проверить свою входящую строку и сгенерирует исключение, если строка не может быть разобрана или не допустимый диапазон (например, если вы хотите HexValue и ваша строка # ZZ8000, тогда вы можете проверить, что в шестнадцатеричной строке не разрешено содержать никаких «Z»).

+0

Hi hiaclibe. Я столкнулся с проблемой написания проверки достоверности включений. Я должен проверить параметр в запросе, чтобы содержать только значение из списка. Например: «степень» - это параметр запроса, который может содержать только значения в [B.E, BSC, UG, PG и т. Д.] – Vicky

+0

@Vicky: Задайте новый вопрос. Ваши новые требования неясны и являются надмножеством тех, которые вы изначально указали в своем вопросе. – Matt