{% raw %}
原文:http://zetcode.com/java/getpostrequest/
本教程显示了如何使用 Java 发送 GET 和 POST 请求。 我们使用内置的HttpURLConnection
类以及标准的 Java 和 Apache HttpClient
类。
超文本传输协议(HTTP)是用于分布式协作超媒体信息系统的应用协议。 HTTP 是万维网数据通信的基础。
在示例中,我们使用httpbin.org
(这是一个免费的 HTTP 请求和响应服务),以及webcode.me
(这是一个用于测试的小型 HTML 页面)。
HTTP GET 方法请求指定资源的表示形式。 使用 GET 的请求应仅检索数据。
HTTP POST 方法将数据发送到服务器。 在上载文件或提交完整的 Web 表单时,通常使用它。
从 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
创建 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"
}
这是输出。
以下示例使用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
创建 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
创建 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());
}
我们逐行读取内容并动态生成字符串消息。
以下示例使用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 请求教程, Jsoup 教程, Java 教程,用 Java 读取网页或 Google Guava 简介。
列出所有 Java 教程。
{% endraw %}