public CompletableFuture<byte[]> execute(String uri, byte[] payload) {
        final HttpRequest request = HttpRequest.of(
                RequestHeaders.builder(HttpMethod.POST, uri).contentType(serializationFormat.mediaType())
                              .add(HttpHeaderNames.TE, HttpHeaderValues.TRAILERS.toString()).build(),
                HttpData.wrap(payload));
        return webClient.execute(request, REQUEST_OPTIONS).aggregate(
                                AggregationOptions.builder()
                                                  .usePooledObjects(PooledByteBufAllocator.DEFAULT)
                                                  .build())
                        .thenApply(msg -> {
                            try (HttpData content = msg.content()) {
                                if (msg.status() != HttpStatus.OK) {
                                    throw new ArmeriaStatusException(
                                            StatusCodes.INTERNAL,
                                            "Non-successful HTTP response code: " + msg.status());
                                }

                                // Status can either be in the headers or trailers depending on error
                                String grpcStatus = msg.headers().get(GrpcHeaderNames.GRPC_STATUS);
                                if (grpcStatus != null) {
                                    checkGrpcStatus(grpcStatus, msg.headers());
                                } else {
                                    grpcStatus = msg.trailers().get(GrpcHeaderNames.GRPC_STATUS);
                                    checkGrpcStatus(grpcStatus, msg.trailers());
                                }
                                return content.array();
                            }
                        });
    }
Executes a unary gRPC client request. The given {@code payload} will be framed and sent to the path at
{@code uri}. {@code uri} should be the method's URI, which is always of the format
{@code /:package-name.:service-name/:method}. For example, for the proto package
{@code armeria.protocol}, the service name {@code CoolService} and the method name
{@code RunWithoutStubs}, the {@code uri} would be {@code /armeria.protocol.CoolService/RunWithoutStubs}.
If you aren't sure what the package, service name, and method name are for your method, you should
probably use normal gRPC stubs instead of this class.
grpc-protocol/src/main/java/com/linecorp/armeria/client/grpc/protocol/UnaryGrpcClient.java