ZetCode

Java HTTP GET/POST 请求

最后修改日期:2024 年 7 月 10 日

在本文中,我们将展示如何在 Java 中发送 GET 和 POST 请求。 我们将使用内置的 HttpURLConnection 类以及标准的 Java 和 Apache HttpClient 类。

HTTP

超文本传输协议 (HTTP) 是一种用于分布式、协作式、超媒体信息系统的应用协议。HTTP 是万维网数据通信的基础。

在示例中,我们使用了 httpbin.org,这是一个免费提供的 HTTP 请求和响应服务,以及 webcode.me,这是一个用于测试的微型 HTML 页面。

HTTP GET

HTTP GET 方法请求指定资源的表示。使用 GET 的请求应该只检索数据。

HTTP POST

HTTP POST 方法将数据发送到服务器。它通常用于上传文件或提交完成的 Web 表单。

使用 Java HttpClient 的 GET 请求

从 Java 11 开始,我们可以使用 java.net.http.HttpClient

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

void main() throws IOException, InterruptedException {

    try (HttpClient client = HttpClient.newHttpClient()) {
        
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://webcode.me"))
                .build();

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

        System.out.println(response.body());
    }
}

我们向 webcode.me 网页发出 GET 请求。

try (HttpClient client = HttpClient.newHttpClient()) {
    ...
}

使用 newHttpClient 工厂方法创建一个新的 HttpClient

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://webcode.me"))
    .build();

我们构建一个到网页的同步请求。 默认方法是 GET。

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

System.out.println(response.body());

我们发送请求并检索响应的内容,并将其打印到控制台。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My html page</title>
</head>
<body>

    <p>
        Today is a beautiful day. We go swimming and fishing.
    </p>
    
    <p>
         Hello there. How are you?
    </p>
    
</body>
</html>

使用 Java HttpClient 的 HTTP POST 请求

下一个示例创建一个使用 Java HttpClient 的 POST 请求。

implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'

我们需要 jackson-databind 依赖项。

Main.java
import com.fasterxml.jackson.databind.ObjectMapper;

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

void main() throws IOException, InterruptedException {

    var values = new HashMap<String, String>() {{
        put("name", "John Doe");
        put("occupation", "gardener");
    }};

    var objectMapper = new ObjectMapper();
    String requestBody = objectMapper.writeValueAsString(values);

    try (HttpClient client = HttpClient.newHttpClient()) {

        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://httpbin.org/post"))
                .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                .build();

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

        System.out.println(response.body());
    }
}

我们向 https://httpbin.org/post 页面发送一个 POST 请求。

var values = new HashMap<String, String>() {{
    put("name", "John Doe");
    put ("occupation", "gardener");
}};

var objectMapper = new ObjectMapper();
String requestBody = objectMapper
        .writeValueAsString(values);

首先,我们使用 Jackson 的 ObjectMapper 构建请求体。

try (HttpClient client = HttpClient.newHttpClient()) {

    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://httpbin.org/post"))
            .POST(HttpRequest.BodyPublishers.ofString(requestBody))
            .build();
    ...
}

我们构建 POST 请求。 通过 BodyPublishers.ofString,我们创建一个新的 BodyPublisher。 它将高级 Java 对象转换为适合作为请求体发送的字节缓冲区流。

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

System.out.println(response.body());

我们发送请求并检索响应。

使用 HttpURLConnection 的 HTTP GET 请求

以下示例使用 HttpURLConnection 创建 GET 请求。

Main.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URI;

HttpURLConnection con;

void main() throws IOException {

    var url = "https://webcode.me";

    try {

        var myurl = URI.create(url).toURL();
        con = (HttpURLConnection) myurl.openConnection();

        con.setRequestMethod("GET");

        StringBuilder content;

        try (BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()))) {

            String line;
            content = new StringBuilder();

            while ((line = in.readLine()) != null) {

                content.append(line);
                content.append(System.lineSeparator());
            }
        }

        System.out.println(content);

    } finally {

        con.disconnect();
    }
}

该示例使用 HTTP GET 请求检索网页。

var url = "https://webcode.me";

我们检索这个小网页的内容。

var myurl = URI.create(url).toURL();
con = (HttpURLConnection) myurl.openConnection();

创建到指定 URL 的连接。

con.setRequestMethod("GET");

我们使用 setRequestMethod 方法设置请求方法类型。

try (BufferedReader in = new BufferedReader(
        new InputStreamReader(con.getInputStream()))) {
    ...
}

从 HTTP 连接对象创建一个输入流。 输入流用于读取返回的数据。

content = new StringBuilder();

我们使用 StringBuilder 构建内容字符串。

while ((line = in.readLine()) != null) {

    content.append(line);
    content.append(System.lineSeparator());
}

我们使用 readLine 逐行从输入流读取数据。 每行都添加到 StringBuilder。 在每行之后,我们附加一个系统相关的行分隔符。

System.out.println(content);

我们将内容打印到终端。

使用 HttpURLConnection 的 HTTP POST 请求

以下示例使用 HttpURLConnection 创建 POST 请求。

Main.java
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URI;
import java.nio.charset.StandardCharsets;

HttpURLConnection con;

void main() throws IOException {

    var url = "https://httpbin.org/post";
    var urlParameters = "name=Jack&occupation=programmer";
    byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

    try {

        var myurl = URI.create(url).toURL();
        con = (HttpURLConnection) myurl.openConnection();

        con.setDoOutput(true);
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", "Java client");
        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

        try (var wr = new DataOutputStream(con.getOutputStream())) {

            wr.write(postData);
        }

        StringBuilder content;

        try (var br = new BufferedReader(
                new InputStreamReader(con.getInputStream()))) {

            String line;
            content = new StringBuilder();

            while ((line = br.readLine()) != null) {
                content.append(line);
                content.append(System.lineSeparator());
            }
        }

        System.out.println(content);

    } finally {

        con.disconnect();
    }
}

该示例将 POST 请求发送到 https://httpbin.org/post

var urlParameters = "name=Jack&occupation=programmer";
byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);

我们将要写入这两个键/值对。 我们将字符串转换为字节数组。

con.setDoOutput(true);

使用 setDoOutput 方法,我们指示我们将要向 URL 连接写入数据。

con.setRequestMethod("POST");

HTTP 请求类型使用 setRequestMethod 设置。

con.setRequestProperty("User-Agent", "Java client");

我们使用 setRequestProperty 方法设置用户年龄属性。

try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {

    wr.write(postData);
}

我们将字节或我们的数据写入 URL 连接。

StringBuilder content;

try (var br = new BufferedReader(
        new InputStreamReader(con.getInputStream()))) {

    String line;
    content = new StringBuilder();

    while ((line = br.readLine()) != null) {

        content.append(line);
        content.append(System.lineSeparator());
    }
}

System.out.println(content);

我们读取连接的输入流并将检索到的内容写入控制台。

使用 Apache HttpClient 的 HTTP GET 请求

以下示例使用 Apache HttpClient 创建 GET 请求。

implementation 'org.apache.httpcomponents:httpclient:4.5.14'

对于这些示例,我们需要这个 Maven 依赖项。

Main.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;

void main() throws IOException {

    try (CloseableHttpClient client = HttpClientBuilder.create().build()) {

        var request = new HttpGet("https://webcode.me");
        HttpResponse response = client.execute(request);

        var bufReader = new BufferedReader(new InputStreamReader(
                response.getEntity().getContent()));

        var builder = new StringBuilder();

        String line;

        while ((line = bufReader.readLine()) != null) {
            
            builder.append(line);
            builder.append(System.lineSeparator());
        }

        System.out.println(builder);
    }
}

该示例发送一个 GET 请求来读取指定网页的主页。

try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
    ...
}

CloseableHttpClient 使用 HttpClientBuilder 构建。

var request = new HttpGet("https://webcode.me");

HttpGet 用于创建 HTTP GET 请求。

HttpResponse response = client.execute(request);

我们执行请求并获取响应。

var bufReader = new BufferedReader(new InputStreamReader(
    response.getEntity().getContent()));

从响应对象中,我们读取内容。

while ((line = bufReader.readLine()) != null) {

    builder.append(line);
    builder.append(System.lineSeparator());
}

我们逐行读取内容并动态构建一个字符串消息。

使用 Apache HttpClient 的 HTTP POST

以下示例使用 HttpPost 创建 POST 请求。

Main.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;

void main() throws IOException {

    try (CloseableHttpClient client = HttpClientBuilder.create().build()) {

        var request = new HttpPost("https://httpbin.org/post");
        request.setHeader("User-Agent", "Java client");
        request.setEntity(new StringEntity("My test data"));

        HttpResponse response = client.execute(request);

        var bufReader = new BufferedReader(new InputStreamReader(
                response.getEntity().getContent()));

        var builder = new StringBuilder();

        String line;

        while ((line = bufReader.readLine()) != null) {

            builder.append(line);
            builder.append(System.lineSeparator());
        }

        System.out.println(builder);
    }
}

该示例将 POST 请求发送到 https://httpbin.org/post

var request = new HttpPost("https://httpbin.org/post");

HttpPost 用于创建 POST 请求。

request.setEntity(new StringEntity("My test data"));

数据使用 setEntity 方法设置。

request.setHeader("User-Agent", "Java client");

我们使用 setHeader 方法为请求设置一个标头。

HttpResponse response = client.execute(request);

我们执行请求并获取响应。

var bufReader = new BufferedReader(new InputStreamReader(
    response.getEntity().getContent()));

var builder = new StringBuilder();

String line;

while ((line = bufReader.readLine()) != null) {

    builder.append(line);
    builder.append(System.lineSeparator());
}

System.out.println(builder);

我们读取响应并将其打印到终端。

来源

Java HttpClient - 语言参考

在本文中,我们使用 HttpURLConnection 以及标准的 Java 和 Apache HttpClient 在 Java 中创建了一个 GET 和一个 POST 请求。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 至今,我撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程