{% raw %}

# Java HTTP GET/POST 请求

原文：http://zetcode.com/java/getpostrequest/

本教程显示了如何使用 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 11 `HttpClient`的 GET 请求

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

`com/zetcode/GetRequestJava11.java`

```java
package com.zetcode;

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 GetRequestJava11 {

    public static void main(String[] args) throws IOException, InterruptedException {

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

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

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

```

我们向`webcode.me`网页创建 GET 请求。

```java
HttpClient client = HttpClient.newHttpClient();

```

使用`newHttpClient()`工厂方法创建一个新的`HttpClient`。

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

```

我们建立对该网页的同步请求。 默认方法是 GET。

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

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

```

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

```java
<!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 11 `HttpClient`的 Java HTTP POST 请求

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

```java
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9.3</version>
</dependency>

```

我们需要`jackson-databind`依赖项。

`com/zetcode/PostRequestJava11.java`

```java
package com.zetcode;

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;

public class HttpClientPost {

    public static void main(String[] args) 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);

        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());
    }
}

```

我们将 POST 请求发送到`https://httpbin.org/post`页面。

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

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

```

首先，我们使用 Jackson 的`ObjectMapper`构建请求主体。

```java
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 对象转换为适合作为请求正文发送的字节缓冲区流。

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

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

```

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

```java
{
    "args": {}, 
    "data": "{\"occupation\":\"gardener\",\"name\":\"John Doe\"}", 
    "files": {}, 
    "form": {}, 
    "headers": {
        "Content-Length": "43", 
        "Host": "httpbin.org", 
        "User-Agent": "Java-http-client/12.0.1"
    }, 
    "json": {
        "name": "John Doe", 
        "occupation": "gardener"
    }, 
    ...
    "url": "https://httpbin.org/post"
    }

```

这是输出。

## 使用`HttpURLConnection`的 Java HTTP GET 请求

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

`com/zetcode/JavaGetRequest.java`

```java
package com.zetcode;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class JavaGetRequest {

    private static HttpURLConnection con;

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

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

        try {

            var myurl = new URL(url);
            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.toString());

        } finally {

            con.disconnect();
        }
    }
}

```

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

```java
var url = "http://webcode.me";

```

我们检索此小型网页的内容。

```java
var myurl = new URL(url);
con = (HttpURLConnection) myurl.openConnection();

```

创建到指定 URL 的连接。

```java
con.setRequestMethod("GET");

```

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

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

```

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

```java
content = new StringBuilder();

```

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

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

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

```

我们使用`readLine()`逐行从输入流中读取数据。 每行都添加到`StringBuilder`中。 在每行之后，我们附加一个与系统有关的行分隔符。

```java
System.out.println(content.toString());

```

我们将内容打印到终端。

## 使用`HttpURLConnection`的 Java HTTP POST 请求

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

`com/zetcode/JavaPostRequest.java`

```java
package com.zetcode;

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

public class JavaPostRequest {

    private static HttpURLConnection con;

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

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

        try {

            var myurl = new URL(url);
            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.toString());

        } finally {

            con.disconnect();
        }
    }
}

```

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

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

```

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

```java
var myurl = new URL(url);
con = (HttpURLConnection) myurl.openConnection();

```

URL 的连接已打开。

```java
con.setDoOutput(true);

```

通过`setDoOutput()`方法，我们指示我们将数据写入 URL 连接。

```java
con.setRequestMethod("POST");

```

HTTP 请求类型通过`setRequestMethod()`设置。

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

```

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

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

    wr.write(postData);
}

```

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

```java
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.toString());

```

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

## 使用 Apache `HttpClient`的 Java HTTP GET 请求

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

```java
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.10</version>
</dependency>

```

对于示例，我们需要此 Maven 依赖关系。

`com/zetcode/ApacheHttpClientGet.java`

```java
package com.zetcode;

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;

public class ApacheHttpClientGet {

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

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

            var request = new HttpGet("http://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 请求以读取指定网页的主页。

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

```

`CloseableHttpClient`是使用`HttpClientBuilder`构建的。

```java
var request = new HttpGet("http://webcode.me");

```

`HttpGet`用于创建 HTTP GET 请求。

```java
HttpResponse response = client.execute(request);

```

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

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

```

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

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

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

```

我们逐行读取内容并动态生成字符串消息。

## Java HTTP POST 与 Apache `HttpClient`

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

`com/zetcode/ApacheHttpClientPost.java`

```java
package com.zetcode;

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;

public class ApacheHttpClientPost {

    public static void main(String[] args) 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);
        }
    }
}

```

The example sends a POST request to `https://httpbin.org/post`.

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

```

`HttpPost`用于创建 POST 请求。

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

```

用`setEntity()`方法设置数据。

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

```

我们使用`setHeader()`方法为请求设置标头。

```java
HttpResponse response = client.execute(request);

```

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

```java
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);

```

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

在本教程中，我们使用`HttpURLConnection`以及标准 Java 和 Apache `HttpClient`在 Java 中创建了 GET 和 POST 请求。

您可能也对以下相关教程感兴趣： [Python 请求教程](/web/pythonrequests/)， [Jsoup 教程](/java/jsoup/)， [Java 教程](/lang/java/)，[用 Java 读取网页](/articles/javareadwebpage/)或 [Google Guava 简介](/articles/guava/)。

列出[所有 Java 教程](/all/#java)。

{% endraw %}