【问题标题】:POST call to another server对另一台服务器的 POST 调用
【发布时间】:2011-02-03 13:25:09
【问题描述】:

嗨,

我们可以从一台服务器向另一台 Web 服务器发出 POST 调用吗?例如,在 server1 中部署的一个 Web 应用程序。当我们调用部署在 server2 中的 web 应用程序时,是否可以使用 POST 方法类型进行调用。或者总是可以是带有显式 URL 的 GET 方法

【问题讨论】:

    标签: java jsp servlets jakarta-ee


    【解决方案1】:

    两种方式:

    1. 如果您当前的请求已经是 POST,只需发送 307 重定向即可。

      response.setStatus(307);
      response.setHeader("Location", "http://other.com");
      

      然而,这将在客户端发出安全确认警告。

    2. 自己玩代理。

      URLConnection connection = new URL("http://other.com").openConnection();
      connection.setDoOutput(true); // POST
      // Copy headers if necessary.
      
      InputStream input1 = request.getInputStream();
      OutputStream output1 = connection.getOutputStream();
      // Copy request body from input1 to output1.
      
      InputStream input2 = connection.getInputStream();
      OutputStream output2 = response.getOutputStream();
      // Copy response body from input2 to output2.
      

      但是,这不会更改 URL,并且客户认为他仍在您的网站上。

    另见:


    更新:您实际上想从 POST 重定向到 GET,包括所有请求参数。在这种情况下,只需收集 POST 参数并将它们作为默认 (302) 重定向中的查询字符串发送。

    String encoding = request.getCharacterEncoding();
    if (encoding == null) {
        encoding = "UTF-8";
        request.setCharacterEncoding(encoding);
    }
    StringBuilder query = new StringBuilder();
    
    for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
        for (String value : entry.getValue()) {
            if (query.length() > 0) query.append("&");
            query.append(URLEncoder.encode(entry.getKey(), encoding));
            query.append("=");
            query.append(URLEncoder.encode(value, encoding));
        }
    }
    
    response.sendRedirect("http://example.com?" + query);
    

    【讨论】:

    • 那么,接收者也应该使用 doPost 来获取正确的值?
    • 当然可以。这是一个 POST 请求。 doPost() 拦截 POST 请求。就这么清楚:)
    • 我们可以从 doPost 重定向到 doGet 并获取值吗?
    • 是的,只需发送默认 (302) 重定向并将 POST 值作为请求查询字符串附加到重定向 URL。查看答案更新。
    【解决方案2】:

    是的,您可以使用HTTPURLConnection

    here 是示例

    try {
        // Construct data
        String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
        data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8");
    
        // Send data
        URL url = new URL("http://hostname:80/cgi");
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(data);
        wr.flush();
    
        // Get the response
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        while ((line = rd.readLine()) != null) {
            // Process line...
        }
        wr.close();
        rd.close();
    } catch (Exception e) {
    //log it ,sms it, mail it
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 2012-08-10
      • 1970-01-01
      • 2014-10-28
      • 2011-12-03
      • 1970-01-01
      • 2020-11-26
      • 2012-10-31
      • 2011-08-23
      相关资源
      最近更新 更多