/** * Replaces all existing queries with the newly supplied url decoded queries. <br> * <br><br><b>relationship to JAXRS 2.0</b><br> <br> Like {@code WebTarget.queries}, except the * values can be templatized. <br> ex. <br> * <pre> * template.queries(ImmutableMultimap.of("Signature", "{signature}")); * </pre> * * @param queries if null, remove all queries. else value to replace all queries with. * @see #queries() */ public RequestTemplate queries(Map<String, Collection<String>> queries) { if (queries == null || queries.isEmpty()) { this.queries.clear(); } else { for (Entry<String, Collection<String>> entry : queries.entrySet()) { query(entry.getKey(), toArray(entry.getValue(), String.class)); } } return this; }
@SuppressWarnings("unchecked") private RequestTemplate addQueryMapQueryParameters(Object[] argv, RequestTemplate mutable) { Map<Object, Object> queryMap = (Map<Object, Object>) argv[metadata.queryMapIndex()]; for (Entry<Object, Object> currEntry : queryMap.entrySet()) { checkState(currEntry.getKey().getClass() == String.class, "QueryMap key must be a String: %s", currEntry.getKey()); Collection<String> values = new ArrayList<String>(); Object currValue = currEntry.getValue(); if (currValue instanceof Iterable<?>) { Iterator<?> iter = ((Iterable<?>) currValue).iterator(); while (iter.hasNext()) { Object nextObject = iter.next(); values.add(nextObject == null ? null : nextObject.toString()); } } else { values.add(currValue == null ? null : currValue.toString()); } mutable.query(metadata.queryMapEncoded(), (String) currEntry.getKey(), values); } return mutable; }
@SuppressWarnings("unchecked") private RequestTemplate addQueryMapQueryParameters( final Object[] argv, final RequestTemplate mutableRequestTemplate) { final Map<Object, Object> queryMap = (Map<Object, Object>) argv[metadata.queryMapIndex()]; for (final Map.Entry<Object, Object> currEntry : queryMap.entrySet()) { checkState(currEntry.getKey().getClass() == String.class, "QueryMap key must be a String: %s", currEntry.getKey()); final Object currValue = currEntry.getValue(); final Collection<String> values = new ArrayList<>(); if (currValue instanceof Iterable<?>) { for (final Object valueObject : (Iterable<?>) currValue) { values.add(valueObject == null ? null : valueObject.toString()); } } else { values.add(currValue == null ? null : currValue.toString()); } mutableRequestTemplate.query((String) currEntry.getKey(), values); } return mutableRequestTemplate; }
query(key, values);
private void signRequestsIfCredentialsNotNull(Feign.Builder builder, @Nullable ApiCredentials credentials){ if (credentials != null) { RequestInterceptor signAllRequests = requestTemplate -> { requestTemplate.query("apikey", credentials.getKey()); requestTemplate.query("nonce", ApiKeySigningUtil.createNonce()); String requestUrl = baseUrl+requestTemplate.request().url(); String sign = ApiKeySigningUtil.createSign(requestUrl, credentials.getSecret()); requestTemplate.header("apisign", sign); }; builder.requestInterceptor(signAllRequests); } } }
@Override public void encode(Object requestBody, Type bodyType, RequestTemplate request) throws EncodeException { Class<?> requestType = requestBody.getClass(); if (AnnotationUtils.findAnnotation(requestType, RaptorMessage.class) != null) { if ("GET".equalsIgnoreCase(request.method())) { try { Map<String, String> map = RaptorMessageUtils.transferMessageToMap(requestBody); for (Map.Entry<String, String> entry : map.entrySet()) { request.query(entry.getKey(), entry.getValue()); } } catch (Exception e) { throw new RuntimeException("Transfer requestBody to query string error.", e); } } else { FeignRequestOutputMessage outputMessage = new FeignRequestOutputMessage(request); try { raptorMessageConverter.write(requestBody, MediaType.APPLICATION_JSON, outputMessage); request.body(outputMessage.body(), StandardCharsets.UTF_8); } catch (IOException ex) { throw new EncodeException("Error converting request body", ex); } request.headers(HttpHeadersUtils.getHeaders(outputMessage.getHeaders())); } } else { throw new RuntimeException("Can't encode requestBody, bodyType must be RaptorMessage."); } } }
@Override public boolean processArgument(AnnotatedParameterContext context, Annotation annotation, Method method) { int parameterIndex = context.getParameterIndex(); Class<?> parameterType = method.getParameterTypes()[parameterIndex]; MethodMetadata data = context.getMethodMetadata(); if (Map.class.isAssignableFrom(parameterType)) { checkState(data.queryMapIndex() == null, "Query map can only be present once."); data.queryMapIndex(parameterIndex); return true; } RequestParam requestParam = ANNOTATION.cast(annotation); String name = requestParam.value(); checkState(emptyToNull(name) != null, "RequestParam.value() was empty on parameter %s", parameterIndex); context.setParameterName(name); Collection<String> query = context.setTemplateParameter(name, data.template().queries().get(name)); data.template().query(name, query); return true; } }
@Override public boolean processArgument(AnnotatedParameterContext context, Annotation annotation, Method method) { int parameterIndex = context.getParameterIndex(); Class<?> parameterType = method.getParameterTypes()[parameterIndex]; MethodMetadata data = context.getMethodMetadata(); if (Map.class.isAssignableFrom(parameterType)) { checkState(data.queryMapIndex() == null, "Query map can only be present once."); data.queryMapIndex(parameterIndex); return true; } RequestParam requestParam = ANNOTATION.cast(annotation); String name = requestParam.value(); checkState(emptyToNull(name) != null, "RequestParam.value() was empty on parameter %s", parameterIndex); context.setParameterName(name); Collection<String> query = context.setTemplateParameter(name, data.template().queries().get(name)); data.template().query(name, query); return true; } }
@Override public boolean processArgument(AnnotatedParameterContext context, Annotation annotation, Method method) { int parameterIndex = context.getParameterIndex(); Class<?> parameterType = method.getParameterTypes()[parameterIndex]; MethodMetadata data = context.getMethodMetadata(); if (Map.class.isAssignableFrom(parameterType)) { checkState(data.queryMapIndex() == null, "Query map can only be present once."); data.queryMapIndex(parameterIndex); return true; } RequestParam requestParam = ANNOTATION.cast(annotation); String name = requestParam.value(); checkState(emptyToNull(name) != null, "RequestParam.value() was empty on parameter %s", parameterIndex); context.setParameterName(name); Collection<String> query = context.setTemplateParameter(name, data.template().queries().get(name)); data.template().query(name, query); return true; } }
paramIndex); Collection<String> query = addTemplatedParam(data.template().queries().get(name), name); data.template().query(name, query); nameParam(data, name, paramIndex); isHttpParam = true;