【发布时间】:2011-02-03 13:25:09
【问题描述】:
嗨,
我们可以从一台服务器向另一台 Web 服务器发出 POST 调用吗?例如,在 server1 中部署的一个 Web 应用程序。当我们调用部署在 server2 中的 web 应用程序时,是否可以使用 POST 方法类型进行调用。或者总是可以是带有显式 URL 的 GET 方法
【问题讨论】:
标签: java jsp servlets jakarta-ee
嗨,
我们可以从一台服务器向另一台 Web 服务器发出 POST 调用吗?例如,在 server1 中部署的一个 Web 应用程序。当我们调用部署在 server2 中的 web 应用程序时,是否可以使用 POST 方法类型进行调用。或者总是可以是带有显式 URL 的 GET 方法
【问题讨论】:
标签: java jsp servlets jakarta-ee
两种方式:
如果您当前的请求已经是 POST,只需发送 307 重定向即可。
response.setStatus(307);
response.setHeader("Location", "http://other.com");
然而,这将在客户端发出安全确认警告。
自己玩代理。
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 请求。就这么清楚:)
是的,您可以使用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
}
【讨论】: