У меня есть REST API, который принимает 3 параметра запроса. Когда запрос вызывается без каких-либо параметров запроса, API выполняется и возвращает результат. Как сделать параметры запроса обязательными? Как я могу добавить проверку, чтобы проверить, присутствуют ли все параметры? Кроме того, пожалуйста, дайте мне знать лучший подход.
Как сделать параметры запроса обязательными в службах REST Java Jersey?
Ответы (2)
На очень простом уровне вы можете просто ввести HttpServletRequest
и проверить себя:
@GET
public Response example(@Context HttpServletRequest request,
@QueryParam("name") String name) {
if (null == request.getParameter("name")) {
ResponseBuilder builder = Response.status(404);
return builder.build();
}
// Do something with name
}
Или вы можете реализовать что-то более сложное, используя АОП. Вот сообщение в блоге о дополнительных возможностях.
jersey не предоставляет обязательной функции проверки параметров из коробки. однако вы можете сделать что-то вроде реализации собственной аннотации для достижения этой цели. Ниже приведен код аннотации:
@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Required {
String[] value();
}
Вам также понадобится фильтр, ниже приведен код:
public class RequiredParamResourceFilterFactory implements ResourceFilterFactory {
@Context
private transient HttpServletRequest servletRequest;
private class RequiredParamFilter implements ResourceFilter, ContainerRequestFilter {
private final String[] requiredParams;
protected List<String> parametersValueMissing;
private RequiredParamFilter(String[] requiredParams) {
this.requiredParams = requiredParams;
}
@Override
public ContainerRequest filter(ContainerRequest containerRequest) {
boolean missingMandatoryParameter = false;
List<String> missingParameters = new ArrayList<String>();
List<String> requiredParametersValueMissing = new ArrayList<String>();
List<String> URLParameters = getURLParameters(containerRequest.getQueryParameters());
List<String> methodRequiredParameters = Arrays.asList(requiredParams);
if (methodRequiredParameters != null) {
for (String methodRequiredParam : methodRequiredParameters) {
if (URLParameters == null) {
missingMandatoryParameter = true; //we will check this flag before returning result set to caller
missingParameters.add(methodRequiredParam);
} else if (!URLParameters.contains(methodRequiredParam)) {
missingMandatoryParameter = true; //we will check this flag before returning result set to caller
missingParameters.add(methodRequiredParam);
//Add to required parameters value missing List, only if the parameter is mandatory and value is not provided
// in the URL
} else if (parametersValueMissing.contains(methodRequiredParam)) {
requiredParametersValueMissing.add(methodRequiredParam);
}
}
if (missingMandatoryParameter && requiredParametersValueMissing.size() > 0) {
throw new YourCustomException("Missing Parameters = " + StringHelper.ArrayToString(missingParameters) +
"\nParameter value missing for " + StringHelper.ArrayToString(requiredParametersValueMissing));
} else if (missingMandatoryParameter) {
throw new YourCustomException("Missing Parameters = " + StringHelper.ArrayToString(missingParameters), MisbarErrorCode.VALIDATION_WRONG_INPUT_ERROR, "Customers");
} else if (requiredParametersValueMissing != null &&
requiredParametersValueMissing.size() > 0) {
throw new YourCustomException("Parameter value missing for " + StringHelper.ArrayToString(requiredParametersValueMissing));
}
}
return containerRequest;
}
@Override
public ContainerRequestFilter getRequestFilter() {
return this;
}
@Override
public ContainerResponseFilter getResponseFilter() {
return null;
}
/**
* To fetch the parameters sent to webservice call, these will be used to find if required parameter
* are present or not
*
* @param queryParams the queryparams sent
* @return all the parameters sent in URL
*/
private List<String> getURLParameters(MultivaluedMap<String,String> queryParams) {
parametersValueMissing = new ArrayList<String>();
List<String> arr = new ArrayList<String>();
for(String key:queryParams.keySet())
{
arr.add(key);
if(queryParams.get(key)==null)
parametersValueMissing.add(key);
}
if(!arr.isEmpty())
return arr;
return null;
}
}
@Override
public List<ResourceFilter> create(AbstractMethod am) {
Required required = am.getAnnotation(Required.class);
if(required!=null)
{
return Collections.<ResourceFilter>singletonList(new RequiredParamFilter(required.value()));
}
return null;
}
}
В приведенном ниже примере показано, как использовать эту аннотацию, поэтому в приведенном ниже веб-сервисе; file_id и count являются обязательными параметрами:
@GET
@Produces(MediaType.APPLICATION_JSON+";charset=utf-8")
@Cacheable(isCacheable = true)
@Path("posts/clusters")
@Required({"file_id","count"})
@Timed
public Response getClusters(
@QueryParam("file_id") Integer fileId,
@QueryParam("count") Integer count,
@DefaultValue("-1")@QueryParam("start_time") Long startTime){
;
}
Если обязательные параметры не указаны в вызове веб-службы, вы получите сообщение об ошибке, как показано ниже, с указанием отсутствующих имен параметров:
{
message: "Missing Parameters = file_id, count",
errorCode: "600"
}
Надеюсь, это решит вашу проблему.