簡體   English   中英

從一台服務器到另一台服務器的POST請求

[英]POST Request from one server to another

情況如下。 我在服務器上收到一個請求,對其進行一些處理,然后需要根據我的處理將請求放置在另一台服務器上,然后根據從遠程服務器獲得的信息來建立響應。 它是在JAVA Playframework 2.0中完成的,在發送請求和從遠程服務器獲取響應的過程中,我缺少了一部分。 任何幫助,將不勝感激。 謝謝 :)

准備中

我們首先需要至少了解URL和charset 參數是可選的,取決於功能要求。

String url = "http://example.com";
String charset = "UTF-8";
String param1 = "value1";
 String param2 = "value2";
// ...
 String query = String.format("param1=%s&param2=%s", 
 URLEncoder.encode(param1, charset), 
 URLEncoder.encode(param2, charset));

查詢參數必須為name = value格式,並由&串聯。 通常,您還可以使用URLEncoder#encode()使用指定的charset對查詢參數進行URL編碼。

String#format()只是為了方便。 當我需要字符串連接運算符+兩次以上時,我更喜歡它。

使用查詢參數觸發HTTP GET請求:

這是一項微不足道的任務。 這是默認的請求方法。

 URLConnection connection = new URL(url + "?" + query).openConnection();
 connection.setRequestProperty("Accept-Charset", charset);
 InputStream response = connection.getInputStream();
 // ...

任何查詢字符串都應使用?連接到URL。 Accept-Charset標頭可能會提示服務器參數的編碼方式。如果您不發送任何查詢字符串,則可以不使用Accept-Charset標頭。 如果您不需要設置任何標題,那么甚至可以使用URL#openStream()快捷方法。

  InputStream response = new URL(url).openStream();
  // ...

無論哪種方式,如果另一端是HttpServlet ,則將調用其doGet()方法,並且HttpServletRequest#getParameter()可以使用參數。 使用查詢參數觸發HTTP POST請求:

使用查詢參數觸發HTTP POST請求:

URLConnection#setDoOutput()為true URLConnection#setDoOutput()請求方法隱式設置為POST。 Web站點的標准HTTP POST類型為application/x-www-form-urlencoded其中查詢字符串被寫入請求主體。

 URLConnection connection = new URL(url).openConnection();
 connection.setDoOutput(true); // Triggers POST.
 connection.setRequestProperty("Accept-Charset", charset);
 connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" +    charset);
 OutputStream output = null;
 try {
    output = connection.getOutputStream();
    output.write(query.getBytes(charset));
  } finally {
   if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
  }
  InputStream response = connection.getInputStream();
  // ...

注意:每當您要以編程方式提交HTML表單時,請不要忘記將任何元素的name = value對放入查詢字符串中,當然還要將想要的元素的name = value對放入其中以編程方式“按下”(因為通常在服務器端使用它來區分是否按下了按鈕,如果按下了,則區分是哪個按鈕)。

您還可以將獲得的URLConnectionHttpURLConnection而改用其HttpURLConnection#setRequestMethod() 但是,如果您嘗試將連接用於輸出,則仍需要將URLConnection #setDoOutput()設置為true。

  HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection();
  httpConnection.setRequestMethod("POST");
  // ...

無論哪種方式,如果另一端是HttpServlet ,則將調用其doPost()方法,並且HttpServletRequest#getParameter()可以使用參數。

順便說一句,它幾乎是以下問題的復制粘貼

使用java.net.URLConnection觸發和處理HTTP請求

要從您的Play服務器調用請求,您應該使用WS API 它易於使用,並且您還可以以異步方式進行遠程調用:

public static Result feedTitle(String feedUrl) {
    return async(
      WS.url(feedUrl).get().map(
        new Function<WS.Response, Result>() {
          public Result apply(WS.Response response) {
            return ok("Feed title:" + response.asJson().findPath("title"));
          }
        }
      )
    );
}

有關Play文檔中的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM