ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
{% 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 %}