public Future<Response> execute(final Request request) {
    checkNotNull(request, "Argument request must be not null");

    final HttpRequest<Buffer> httpClientRequest;

    try {
      httpClientRequest = makeHttpClientRequest(request);
    } catch (final MalformedURLException unexpectedException) {
      return Future.failedFuture(unexpectedException);
    }

    final Future<HttpResponse<Buffer>> responseFuture =
        request.body() != null
            ? httpClientRequest.sendBuffer(Buffer.buffer(request.body()))
            : httpClientRequest.send();

    return responseFuture.compose(
        response -> {
          final Map<String, Collection<String>> responseHeaders =
              StreamSupport.stream(response.headers().spliterator(), false)
                  .collect(
                      Collectors.groupingBy(
                          Map.Entry::getKey,
                          Collectors.mapping(
                              Map.Entry::getValue, Collectors.toCollection(ArrayList::new))));

          byte[] body = response.body() != null ? response.body().getBytes() : null;

          return Future.succeededFuture(
              Response.builder()
                  .status(response.statusCode())
                  .reason(response.statusMessage())
                  .headers(responseHeaders)
                  .body(body)
                  .request(request)
                  .build());
        });
  }
Executes HTTP request and returns {@link Future} with response.

@param request request
@return future of HTTP response
vertx/feign-vertx/src/main/java/feign/vertx/VertxHttpClient.java