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