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
。
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
依赖项。
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 请求。
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 请求。
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 依赖项。
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 请求。
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);
我们读取响应并将其打印到终端。
来源
在本文中,我们使用 HttpURLConnection
以及标准的 Java 和 Apache HttpClient
在 Java 中创建了一个 GET 和一个 POST 请求。
作者
列出所有Java教程。