Ich habe eine REST-API, die 3 Abfrageparameter akzeptiert. Wenn die Abfrage ohne einen der Abfrageparameter aufgerufen wird, führt die API das Ergebnis aus und gibt es zurück. Wie machen wir die Abfrageparams obligatorisch? Wie kann ich eine Validierung hinzufügen, um zu überprüfen, ob alle Parameter vorhanden sind? Bitte lassen Sie mich auch den besten Ansatz wissen.Wie mache ich Abfrageparams in Java-Jersey-REST-Diensten obligatorisch?
Antwort
auf einem sehr einfachen Niveau könnte man einfach die HttpServletRequest
injizieren und selbst überprüfen:
@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
}
Oder Sie können etwas aufwändigere mit AOP implementieren. Here's ein Blogpost über weitere Optionen.
Trikot bietet keine obligatorische Parameterüberprüfung Funktionalität sofort aus. Sie können jedoch etwas tun, um Ihre eigene Anmerkung zu implementieren. Unten ist der Annotation-Code:
@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Required {
String[] value();
}
Sie auch einen Filter benötigen, unten ist der Code:
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;
}
}
Below Beispiel zeigt, wie diese Anmerkung verwenden, so in unter webservice; file_id und Zählung sind Pflichtparameter:
@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){
;
}
Wenn obligatorische Parameter nicht in Webservice Aufruf zur Verfügung gestellt werden, erhalten Sie einen Fehler wie unten, die Parameternamen zu erwähnen, die fehlen:
{
message: "Missing Parameters = file_id, count",
errorCode: "600"
}
Hope this lösen Ihre Problem.
- 1. Wie mache ich Excel-Zellen obligatorisch?
- 2. POST zu einem URI mit GET-Abfrageparams?
- 3. Making ClickOnce Updates obligatorisch?
- 4. Wie mache ich Hintergrundcode?
- 5. Wie mache ich Konfetti?
- 6. XAML - ist LayoutRoot obligatorisch?
- 7. Ist Infinispan.xml obligatorisch?
- 8. Warum ist RouterLink in Angular2 obligatorisch?
- 9. Wie mache ich einen Bildkonverter?
- 10. Wie mache ich ein DLOOKUP
- 11. Wie mache ich = GETPIVOTDATA dynamischer?
- 12. Wie mache ich ein Privateigentum?
- 13. Wie mache ich UILabel wordwrap
- 14. Wie mache ich lesbare URLs?
- 15. Wie mache ich eine Schleife in Assembler?
- 16. Wie mache ich benutzerdefinierte Seitennummerierung in Latex?
- 17. Wie mache ich UpdatePanel in ListView arbeiten?
- 18. Wie mache ich verschachtelte Gruppierungen in Django?
- 19. Wie mache ich monkeypatching in Python?
- 20. Wie mache ich Transaktionen in Service Layer
- 21. Wie mache ich li in angularJS aktiv?
- 22. Wie mache ich Klassenmethoden/Eigenschaften in Swift?
- 23. Wie mache ich boundingRect() in einer Bogenform?
- 24. Wie mache ich Multithreading in Python?
- 25. Wie mache ich HTML-Code in Farbe?
- 26. Wie mache ich ein Quadrat in C++
- 27. Wie mache ich Balloon ToolTip in SilverlightApplication?
- 28. Wie mache ich Systembefehlsaufrufe in Java/Groovy?
- 29. Wie mache ich linkTo dynamisch in ember?
- 30. Wie mache ich das in Unity?