优秀的编程知识分享平台

网站首页 > 技术文章 正文

Java HttpClient介绍(java的http)

nanyue 2025-06-12 14:55:52 技术文章 7 ℃

在Java中,HttpClient是用于发送HTTP请求的API。从Java 11开始,Java标准库提供了内置的HttpClient类(位于java.net.http包中),它支持同步和异步请求,并提供了更简洁的API。

HttpClient发送HTTP请求的使用说明:

创建HttpClient实例

HttpClient是线程安全的,建议全局创建一个实例并重复使用。

import java.net.http.HttpClient;
HttpClient httpClient = HttpClient.newHttpClient();

发送HTTP GET请求

同步请求

package org.example;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HttpClientExample {
    public static void main(String[] args) {
        HttpResponse<String> response;
        try (HttpClient httpClient = HttpClient.newHttpClient()) {
            // 创建请求
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create("https://www.baidu.com/"))
                    .GET()
                    .build();
            // 发送请求并获取响应
            response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
            // 输出响应
            System.out.println("Status Code: " + response.statusCode());
            System.out.println("Response Body: " + response.body());
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

异步请求

package org.example;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;

public class AsyncHttpClientExample {
    public static void main(String[] args) {
        CompletableFuture<HttpResponse<String>> future;
        try (HttpClient httpClient = HttpClient.newHttpClient()) {
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create("https://www.baidu.com/"))
                    .GET()
                    .build();

            // 异步发送请求
            future = httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString());
        }

        // 处理异步响应
        future.thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .join(); // 等待异步操作完成(仅用于示例,实际中可能不需要)
    }
}

发送HTTP POST请求

发送JSON数据

package org.example;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class PostRequestExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpClient httpClient = HttpClient.newHttpClient();
        String jsonBody = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://jsonplaceholder.typicode.com/posts"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(jsonBody))
                .build();

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

        System.out.println("Status Code: " + response.statusCode());
        System.out.println("Response Body: " + response.body());
    }
}

处理请求头和响应头

添加自定义请求头

package org.example;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HeaderExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpClient httpClient = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://example.com"))
                .header("Authorization", "Bearer YOUR_TOKEN")
                .header("User-Agent", "Java HttpClient")
                .GET()
                .build();
        HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println("Content-Type: " + response.headers().firstValue("Content-Type").orElse(""));
    }
}

处理超时和重定向

设置超时

HttpClient httpClient = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build();

使用代理

HttpClient httpClient = HttpClient.newBuilder() .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 8080))) .build();

注意事项

  1. Java版本要求:java.net.http.HttpClient需要Java 11或更高版本。
  2. 异常处理:发送请求时可能抛出IOException或InterruptedException,需捕获处理。
  3. 性能:HttpClient是线程安全的,适合高并发场景。
  4. 异步请求:使用sendAsync时,可通过CompletableFuture链式调用处理响应。

替代方案(Java 11之前)

如果使用Java 8或更早版本,可以考虑以下替代库:

  • Apache HttpClient:功能强大,但需要额外依赖。
  • OkHttp:轻量级且高效,适合移动和后端开发。

总结

  • Java 11+:优先使用内置的java.net.http.HttpClient,支持同步/异步请求,功能完善。
  • Java 8或更早:选择Apache HttpClient或OkHttp等第三方库。

Tags:

最近发表
标签列表