Java代码实现的HttpClient的Demo,包括了GET请求和POST请求详细讲解

下面是一个Java代码实现的HttpClient的Demo,包括了GET请求和POST请求,同时对代码详细的讲解。
我们先看GET请求和POST请求的完整demo代码,然后再详细讲解。

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpHeaders;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.net.http.HttpResponse.BodySubscriber;
import java.net.http.HttpResponse.BodySubscribers;
import java.net.http.HttpResponse.ResponseInfo;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

public class HttpClientDemo {

    private final static String BASE_URL = "<https://www.baidu.com>";

    public static void main(String[] args) throws Exception {

        // GET请求
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(BASE_URL + "/posts"))
                .header("Content-Type", "application/json")
                .GET()
                .build();
        HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
        System.out.println("GET请求响应状态码:" + response.statusCode());
        System.out.println("GET请求响应报文:" + response.body());

        // POST请求
        Map<String, String> params = new HashMap<>();
        params.put("title", "foo");
        params.put("body", "bar");
        params.put("userId", "1");
        String requestBody = getRequestBody(params);
        request = HttpRequest.newBuilder()
                .uri(URI.create(BASE_URL + "/posts"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                .build();
        response = client.send(request, BodyHandlers.ofString());
        System.out.println("POST请求响应状态码:" + response.statusCode());
        System.out.println("POST请求响应报文:" + response.body());
    }

    /**
     * 获取POST请求的请求体
     * @param params 请求参数
     * @return 请求体
     * @throws UnsupportedEncodingException
     */
    public static String getRequestBody(Map<String, String> params) throws UnsupportedEncodingException {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            sb.append(URLEncoder.encode(key, StandardCharsets.UTF_8.toString()));
            sb.append("=");
            sb.append(URLEncoder.encode(value, StandardCharsets.UTF_8.toString()));
            sb.append("&");
        }
        return sb.toString();
    }
}

GET请求

首先,我们需要创建一个HttpClient对象,这个对象是Java11中新增的类,在Java9中引入了Java9的Reactive Streams中的Flow API,同时HttpClient还支持HTTP/2协议和WebSocket。

HttpClient client = HttpClient.newHttpClient();

接下来,我们需要创建一个HttpRequest对象。这个对象包含了请求的方法、URL、请求头等信息。对于GET请求来说,我们只需要指定URL,同时可以添加一些请求头信息,比如Content-Type。

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(BASE_URL + "/posts"))
        .header("Content-Type", "application/json")
        .GET()
        .build();

最后,我们需要发送这个请求,同时还需要指定响应的处理方式。在这个Demo中,我们使用了BodyHandlers.ofString(),这个处理器会将响应体作为字符串返回。

HttpResponse<String> response = client.send(request, BodyHandlers.ofString());

POST请求

对于POST请求来说,我们需要在请求体中添加一些参数。这个Demo中,我们使用了一个Map来保存这些参数,然后再将参数转换成请求体。具体实现可以参考getRequestBody方法。

Map<String, String> params = new HashMap<>();
params.put("title", "foo");
params.put("body", "bar");
params.put("userId", "1");
String requestBody = getRequestBody(params);

接下来,我们需要创建一个HttpRequest对象。对于POST请求来说,我们需要指定请求体的内容,同时还需要添加一些请求头信息。

request = HttpRequest.newBuilder()
        .uri(URI.create(BASE_URL + "/posts"))
        .header("Content-Type", "application/json")
        .POST(HttpRequest.BodyPublishers.ofString(requestBody))
        .build();

最后,我们发送这个POST请求,处理响应的方式和GET请求一样。

response = client.send(request, BodyHandlers.ofString());