场景如下。 我在我的服务器上收到一个请求,对其进行一些处理,然后我需要根据我的处理在另一台服务器上发出请求,然后根据我从远程服务器获得的内容构建响应。 它是在 JAVA Playframework 2.0 中完成的,我缺少发送请求和从远程服务器获取响应的部分。 任何帮助,将不胜感激。 谢谢:)
最佳答案
准备
我们首先需要至少知道 URL 和字符集
。参数是可选的,取决于功能需求。
String url = "http://example.com";
String charset = "UTF-8";
String param1 = "value1";
String param2 = "value2";
// ...
String query = String.format("param1=%s¶m2=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(param2, charset));
查询参数必须采用名称=值的格式,并用&连接。通常,您还可以使用 URLEncoder#encode()
对具有指定字符集
的查询参数进行 URL 编码。
String#format() 只是为了方便。当我需要字符串连接运算符 + 两次以上时,我更喜欢它。
使用(可选)查询参数触发 HTTP GET 请求:
这是一项微不足道的任务。这是默认的请求方法。
URLConnection connection = new URL(url + "?" + query).openConnection();
connection.setRequestProperty("Accept-Charset", charset);
InputStream response = connection.getInputStream();
// ...
任何查询字符串都应使用 ? 连接到 URL。 Accept-Charset
header 可能会提示服务器参数的编码方式。如果您不发送任何查询字符串,则可以保留 Accept-Charset
header 。如果您不需要设置任何 header ,那么您甚至可以使用 URL#openStream()
快捷方法。
InputStream response = new URL(url).openStream();
// ...
无论哪种方式,如果对方是一个 HttpServlet
,那么它的 doGet()
方法将被调用,并且参数将通过 HttpServletRequest#getParameter 获得()
。
使用查询参数触发 HTTP POST 请求:
使用查询参数触发 HTTP POST 请求:
将 URLConnection#setDoOutput()
设置为 true 会隐式将请求方法设置为 POST。 Web from 所做的标准 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 表单时,请不要忘记将任何元素的名称=值对放入查询字符串中,当然还有您要添加的元素的名称=值对。我想以编程方式“按下”(因为这通常在服务器端使用来区分是否按下了按钮,如果按下了,是哪个按钮)。
您还可以将获取的 URLConnection
转换为 HttpURLConnection
并使用其 HttpURLConnection#setRequestMethod()
来代替。但如果您尝试使用连接进行输出,您仍然需要将 URLConnection
#setDoOutput()
设置为 true。
HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection();
httpConnection.setRequestMethod("POST");
// ...
无论哪种方式,如果对方是一个 HttpServlet
,那么它的 doPost()
方法将被调用,并且参数将通过 HttpServletRequest#getParameter 获得()
.
顺便说一句,它几乎是以下问题的复制粘贴
Using java.net.URLConnection to fire and handle HTTP requests
关于java - 从一台服务器到另一台服务器的 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11981340/