Java 对另一个服务器的POST调用

Java 对另一个服务器的POST调用,java,jsp,servlets,jakarta-ee,Java,Jsp,Servlets,Jakarta Ee,嗨 我们可以从一个服务器向另一个web服务器进行POST呼叫吗。例如,服务器1中部署了一个web应用程序。当我们调用部署在server2中的web应用程序时,可以使用POST方法类型进行调用。或者始终可以使用带有显式URL的GET方法是的,您可以使用 这就是例子 try { // Construct data String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "

我们可以从一个服务器向另一个web服务器进行POST呼叫吗。例如,服务器1中部署了一个web应用程序。当我们调用部署在server2中的web应用程序时,可以使用POST方法类型进行调用。或者始终可以使用带有显式URL的GET方法

是的,您可以使用

这就是例子

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
}
是的,你可以使用

这就是例子

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
}
两种方式:

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

    response.setStatus(307);
    response.setHeader("Location", "http://other.com");
    
    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);
    
    但是,这将在客户端发出安全确认警告

  • 你自己玩吧

    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)重定向中将其作为查询字符串发送

    response.setStatus(307);
    response.setHeader("Location", "http://other.com");
    
    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);
    
    String encoding=request.getCharacterEncoding();
    if(编码==null){
    encoding=“UTF-8”;
    请求.setCharacterEncoding(编码);
    }
    StringBuilder查询=新建StringBuilder();
    for(条目:request.getParameterMap().entrySet()){
    for(字符串值:entry.getValue()){
    if(query.length()>0)query.append(&);
    append(URLEncoder.encode(entry.getKey(),encoding));
    查询。追加(“=”);
    append(URLEncoder.encode(值,编码));
    }
    }
    response.sendRedirect(“http://example.com?“+查询);
    
    两种方式:

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

    response.setStatus(307);
    response.setHeader("Location", "http://other.com");
    
    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);
    
    但是,这将在客户端发出安全确认警告

  • 你自己玩吧

    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)重定向中将其作为查询字符串发送

    response.setStatus(307);
    response.setHeader("Location", "http://other.com");
    
    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);
    
    String encoding=request.getCharacterEncoding();
    if(编码==null){
    encoding=“UTF-8”;
    请求.setCharacterEncoding(编码);
    }
    StringBuilder查询=新建StringBuilder();
    for(条目:request.getParameterMap().entrySet()){
    for(字符串值:entry.getValue()){
    if(query.length()>0)query.append(&);
    append(URLEncoder.encode(entry.getKey(),encoding));
    查询。追加(“=”);
    append(URLEncoder.encode(值,编码));
    }
    }
    response.sendRedirect(“http://example.com?“+查询);
    
    因此,接收器也应该使用doPost来获得正确的值?当然可以。这是一个邮寄请求。
    doPost()
    会拦截POST请求。明确如下:)我们可以从doPost重定向到doGet并获取值吗?是的,只需发送一个默认(302)重定向并将POST值作为请求查询字符串附加到重定向URL。请参阅答案更新。因此,接收器也应该使用doPost来获得正确的值?当然。这是一个邮寄请求。
    doPost()
    会拦截POST请求。明确如下:)我们可以从doPost重定向到doGet并获取值吗?是的,只需发送一个默认(302)重定向并将POST值作为请求查询字符串附加到重定向URL。请参阅答案更新。