用 Java 实现 HTTP Post

Rupam Yadav 2023年10月12日
  1. 在 Java 中使用 HttpURLConnection 的 HTTP 发布
  2. 在 Java 中使用 Apache HttpClient 的 HTTP 发布
用 Java 实现 HTTP Post

在本教程中,我们将讨论如何使用 Java 中的不同方法发送 HTTP POST 请求。HTTP 的请求方法有几种,POST 就是其中之一。

POST 用于向服务器发送一些数据。我们将使用网站 https://postman-echo.com 来测试我们的示例数据。

在 Java 中使用 HttpURLConnection 的 HTTP 发布

第一个示例使用 HttpURLConnection 类,该类使用各种功能扩展 URLConnection 抽象类来执行网络操作。

在程序中,我们创建一个 URL 的对象 dummyUrl 并传递我们使用的端点 https://postman-echo.com/post。当我们发送一个 post 请求时,我们会发送一些数据。

dummyData 保存数据,其中 firstnamelastname 作为键,johndoe 作为它们的值,两个键值对都附加了 & 符号。

现在,我们调用 URL 类的 openConnection() 方法,该方法返回一个 URLConnection 对象,我们可以将其转换并保存为 HttpURLConnection 类型的对象。

要设置 request 方法,我们调用 setRequestMethod() 函数并传递请求类型。如果我们想将数据发送到 API,我们需要启用 doOutput 字段以启用输出连接。

下一步是使用接受键和值作为其参数的 setRequestProperty() 函数设置请求属性。

第一个请求属性是 Content-Type,指定我们要发送的内容类型,第二个属性告诉要使用的字符集,最后一个属性告诉发布数据的 Content-Length。

要获取响应数据,我们需要使用 getOutputStream() 函数从 httpUrlConnection 获取输出流,并将其作为 DataOutputStream 构造函数的参数传递。

这将返回一个 DataOutputStream 对象。我们使用 writeBytes() 方法写入 dataOutputStream 的数据。

接下来,我们使用 getInputStream() 函数获取输入流,并在 InputStreamReader() 中使用它来获取 BufferedReader 对象。

为了从流中读取数据,我们创建了一个循环并从 BufferedReader 读取每一行并将其输出到控制台上。

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

class ExampleClass1 {
  public static void main(String[] args) throws MalformedURLException {
    URL dummyUrl = new URL("https://postman-echo.com/post");
    String dummyData = "firstname=john&lastname=doe";

    try {
      HttpURLConnection httpUrlConnection = (HttpURLConnection) dummyUrl.openConnection();

      httpUrlConnection.setRequestMethod("POST");
      httpUrlConnection.setDoOutput(true);

      httpUrlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
      httpUrlConnection.setRequestProperty("charset", "utf-8");
      httpUrlConnection.setRequestProperty("Content-Length", Integer.toString(dummyData.length()));

      DataOutputStream dataOutputStream = new DataOutputStream(httpUrlConnection.getOutputStream());
      dataOutputStream.writeBytes(dummyData);

      InputStream inputStream = httpUrlConnection.getInputStream();

      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

      String stringLine;
      while ((stringLine = bufferedReader.readLine()) != null) {
        System.out.println(stringLine);
      }

    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

输出:

{"args":{},"data":"","files":{},"form":{"firstname":"john","lastname":"doe"},"headers":{"x-forwarded-proto":"https","x-forwarded-port":"443","host":"postman-echo.com","x-amzn-trace-id":"Root=1-6204df8b-078f0e863f06000030e99563","content-length":"27","content-type":"application/x-www-form-urlencoded","charset":"utf-8","user-agent":"Java/15.0.1","accept":"text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"},"json":{"firstname":"john","lastname":"doe"},"url":"https://postman-echo.com/post"}

在 Java 中使用 Apache HttpClient 的 HTTP 发布

在本教程的这一部分中,我们将使用外部库来发送 HTTP 发布请求。我们使用以下 maven 依赖项导入 Apache 库。

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

HttpClient 是一组有助于执行 HTTP 操作的方法。

在下面的代码中,我们调用 HttpClientscreateDefault() 方法来构建返回 CloseableHttpClient 对象的创建 HttpClientBuilder

我们需要设置 URI 和参数以与 post 请求一起发送。为此,我们调用 RequestBuilder.post() 并使用 setURI() 设置 URI。

然后两个参数使用带有键和值的 addParameter() 函数。

我们使用 closeableHttpClient 对象调用 execute() 函数,并将 httpUriRequest 作为其返回 CloseableHttpResponse 对象的参数。

现在我们调用 getEntity() 函数从 closeableHttpClientResponse 获取 HttpEntity 并使用 EntityUtils.toString() 将其转换为字符串。

接下来,我们打印来自 closeableHttpClientResponse 的响应。

import java.io.*;
import java.net.*;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

class ExampleClass1 {
  public static void main(String[] args) {
    CloseableHttpClient closeableHttpClient = HttpClients.createDefault();

    try {
      URI dummyUri = new URI("https://postman-echo.com/post");

      HttpUriRequest httpUriRequest = RequestBuilder.post()
                                          .setUri(dummyUri)
                                          .addParameter("firstname", "Dwayne")
                                          .addParameter("lastname", "Johnson")
                                          .build();

      CloseableHttpResponse closeableHttpClientResponse =
          closeableHttpClient.execute(httpUriRequest);

      String getResponse = EntityUtils.toString(closeableHttpClientResponse.getEntity());

      System.out.println(getResponse);

    } catch (IOException | URISyntaxException e) {
      e.printStackTrace();
    } finally {
      try {
        closeableHttpClient.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

输出:

{"args":{},"data":"","files":{},"form":{"firstname":"Dwayne","lastname":"Johnson"},"headers":{"x-forwarded-proto":"https","x-forwarded-port":"443","host":"postman-echo.com","x-amzn-trace-id":"Root=1-6204eaa0-7444d40757db202e2815744d","content-length":"33","content-type":"application/x-www-form-urlencoded; charset=UTF-8","user-agent":"Apache-HttpClient/4.5.13 (Java/15.0.1)","accept-encoding":"gzip,deflate"},"json":{"firstname":"Dwayne","lastname":"Johnson"},"url":"https://postman-echo.com/post"}
作者: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn