用 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