Преобразовать синхронизацию httpURLConnection в асинхронный HttpClient - PullRequest
0 голосов
/ 17 июня 2019

У меня есть синхронный код, основанный на httpURLConnection, и я должен преобразовать его в асинхронный режим.Базовый синхронный режим полностью функционален, работает правильно.Чтобы сделать это асинхронным способом, я пытаюсь использовать HttpClient с методом sendAsync (JDK11).Но я застрял.

Краткая информация о проекте выглядит следующим образом: 1) Несколько тестовых классов, расширяющих класс abstractAPITest.2) Этот класс abstractAPITest имеет функцию установления соединения, и сейчас я работаю над этим.3) класс User, который вызывает тестовые классы. 4) Основной класс, который создает экземпляры User в нескольких потоках и запускает их.

Возможно, мне следует переместить функцию открытого соединения в класс User или в основной класс?ИДК.

Вот что у меня изначально (синхронизация):

byte[] sendRequest(JSONObject jsonObject, String username, String password) throws IOException, URISyntaxException {
        HttpURLConnection httpURLConnection = (HttpURLConnection) (new URL(this.apiUrl)).openConnection();
        if (username != null && password != null) {
            String userPassword = username + ":" + password;
            httpURLConnection.setRequestProperty("Authorization", "Basic " + DatatypeConverter.printBase64Binary(userPassword.getBytes()));
        }
        httpURLConnection.setRequestProperty("Content-Type", "application/json");
        httpURLConnection.setDoOutput(true);
        DataOutputStream dataOutputStream = new DataOutputStream(httpURLConnection.getOutputStream());
        dataOutputStream.write(jsonObject.toString().getBytes());
        dataOutputStream.flush();
        log.info("REST send: JSONObject");
        if (httpURLConnection.getResponseCode() != 200) {
            log.error("REST send error");
            throw new IOException();
        } else {
            byte[] responseBody = null;
            StringBuilder data = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
            String line;

            while ((line = br.readLine()) != null) {
                data.append(line);
                responseBody = data.toString().getBytes();
            }
            br.close();
            return responseBody;
        }
    }

и что у меня есть async:

byte[] request = jsonObject.toString().getBytes();

        String userPassword;
        if (username != null && password != null) {
            userPassword = username + ":" + password;
        } else {
            throw new NullPointerException("No username and/or password.");
        }

        byte[] responseBody = null;
        byte[] request = jsonObject.toString().getBytes();

        var client = HttpClient.newHttpClient();

        var httpRequest = HttpRequest.newBuilder()
                .uri(new URI(apiUrl))
                .version(HttpClient.Version.HTTP_2)
                .header("Content-Type", "application/json")
                .header("Authorization", "Basic " + DatatypeConverter.printBase64Binary(userPassword.getBytes()))
                .POST(HttpRequest.BodyPublishers.ofByteArray(request))
                .build();

        HttpResponse.BodyHandler<String> bodyHandler = HttpResponse.BodyHandlers.ofString();

        CompletableFuture<HttpResponse<String>> future = client.sendAsync(httpRequest, bodyHandler);
        future.thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .join();

        byte[] responseBody = null; // DON'T PAY ATTENTION 
        return responseBody;        // TO THESE TWO LINES
    }

    private static String basicAuthorization(String username, String password) {
        String userPassword = null;
        if (username != null && password != null) {
            userPassword = username + ":" + password;
        }
        return "Basic " + DatatypeConverter.printBase64Binary(userPassword.getBytes());
    }

Так что мне нужен этот асинхронный метод, сделайте то же самоекак метод синхронизации, но асинхронно.Так что я могу делать дальше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...