场景如下。我在我的服务器上收到一个请求,对其进行一些处理,然后我需要根据我的处理将请求放在另一台服务器上,然后根据我从远程服务器获得的内容构建响应。它要在 JAVA Playframework 2.0 中完成,我缺少发送请求和从远程服务器获取响应的部分内容。任何帮助,将不胜感激。谢谢 :)
2 回答
要从 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 文档中的更多信息。
准备中
我们首先需要至少知道 URL 和charset
. 这些参数是可选的,取决于功能要求。
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));
查询参数必须采用 name=value 格式并由 & 连接。您通常还会使用指定的charset
using对查询参数进行 URL 编码URLEncoder#encode()
。
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();
// ...
无论哪种方式,如果对方是 a HttpServlet
,则将调用其doGet()
方法并且参数将由HttpServletRequest#getParameter()
. 使用查询参数触发 HTTP POST 请求:
使用查询参数触发 HTTP POST 请求:
将 设置URLConnection#setDoOutput()
为 true 会隐式地将请求方法设置为 POST。作为 web froms 的标准 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 对以编程方式“按下”(因为通常在服务器端使用它来区分是否按下了按钮,如果按下了,则按下哪个按钮)。
您也可以将获得URLConnection
的转换为HttpURLConnection
并使用它HttpURLConnection#setRequestMethod()
。但是,如果您尝试使用连接进行输出,您仍然需要设置URLConnection
#setDoOutput()
为 true。
HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection();
httpConnection.setRequestMethod("POST");
// ...
无论哪种方式,如果对方是 a HttpServlet
,则将调用其doPost()
方法并且参数将由HttpServletRequest#getParameter()
.
顺便说一句,它几乎是来自以下问题的复制粘贴