下面是一个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());