Java 中用于 Http 请求的 Javascript Fetch API 等效吗?

enn*_*nth 5 javascript java multithreading apache-httpclient-4.x

我目前正在学习 Java 中的线程。我想知道在 Java 中发出 Http 请求时的标准协议是什么,它类似于我下面的代码,它使用 Javascript Fetch API 和异步编程。例如,如果我在 Javascript 中使用 Fetch API首先发出GET请求,从 REST 端点获取一些数据,稍后我将使用该数据发出POST请求(如下面的代码所示),我需要使用回调函数Promise(如下所示)等待一个请求检索到第二个请求的数据,然后继续。显然,如果我没有使用 Promises 或将第二个 Http POST嵌套在下面的第一个 Fetch 方法 ( GET ) 中,并编写了两个单独的 Fetch API 调用(一个用于GET,一个用于POST,顺序一个接一个又名从上到下) ),两个调用都会同时“触发”,并且第二个POST请求将没有成功POST所需的数据。

const myHttpGETandPOSTmethod = () => {

    // First Http request goes here

    fetch('http://example.com/movies.json', {
            method: 'GET',
            headers: // Some headers here,
        })
        .then(response => response.json())
        .then(data => {
                console.log(data))

            // Nest the second Http request inside here. It only runs after 1st request completes

            return fetch('http://example.com/movies.json', {
                    method: 'POST',
                    headers: // Some headers here,
                        body: JSON.stringify(body);
                })
                .then((response) => response.json())
                .then((data) => {
                    console.log('Success:', data);
                })
                .catch((error) => {
                    console.error('Error:', error);
                });
        })
}
Run Code Online (Sandbox Code Playgroud)

那么,如果我在 Java 中使用Apache HttpClient https://hc.apache.org/httpcomponents-client-4.5.x/quickstart.html库之类的东西,标准过程是否是“启动”另一个线程(除了主线程)执行GET请求,然后执行thread.join(),以便在第一个线程完成后,第二个请求可以触发自己的线程?

我是否需要使用Callable而不是Runnable以便保存第一个GET请求的 HttpEntity 数据响应?

我想我只是想了解实现上面提出的关于发出后续 POST 请求所需的 HTTP GET 请求的场景的最佳方法,同时两者都是异步触发的,这样它们就不会阻塞主线程。

您可以使用 apache Http Library发出基本的GET请求( POST也非常相似):

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://targethost/homepage");
CloseableHttpResponse response1 = httpclient.execute(httpGet);

try {
    System.out.println(response1.getStatusLine());
    HttpEntity entity1 = response1.getEntity();

    // Save the response body to a string
    String body = EntityUtils.toString(entity1, StandardCharsets.UTF_8);
    System.out.println(body);

    EntityUtils.consume(entity1);
} finally {
    response1.close();
}
Run Code Online (Sandbox Code Playgroud)

或者我在这里采取了错误的方法并错误地看待这个问题?我相信 Apache 中的 Http 库提供同步和异步 Http 调用?或者我应该在 Java 中使用更新的 Http 库?