Java HTTP GET/POST 请求

本教程显示了如何使用 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

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 请求。

HttpClient client = HttpClient.newHttpClient();

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

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("http://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 11 HttpClient的 Java HTTP POST 请求

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

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

我们需要jackson-databind依赖项。

com/zetcode/PostRequestJava11.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页面。

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

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

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

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

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

{
    "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"
    }

This is the output.

使用HttpURLConnection的 Java HTTP GET 请求

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

com/zetcode/JavaGetRequest.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 请求检索网页。

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

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

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

我们将内容打印到终端。

使用HttpURLConnection的 Java HTTP POST 请求

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

com/zetcode/JavaPostRequest.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

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

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

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

URL 的连接已打开。

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

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

使用 Apache HttpClient的 Java HTTP GET 请求

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

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

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

com/zetcode/ApacheHttpClientGet.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 请求以读取指定网页的主页。

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

CloseableHttpClient是使用HttpClientBuilder构建的。

var request = new HttpGet("http://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());
}

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

Java HTTP POST 与 Apache HttpClient

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

com/zetcode/ApacheHttpClientPost.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.

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

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

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程