0

场景如下。我在我的服务器上收到一个请求,对其进行一些处理,然后我需要根据我的处理将请求放在另一台服务器上,然后根据我从远程服务器获得的内容构建响应。它要在 JAVA Playframework 2.0 中完成,我缺少发送请求和从远程服务器获取响应的部分内容。任何帮助,将不胜感激。谢谢 :)

4

2 回答 2

3

要从 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 文档中的更多信息。

于 2012-08-16T12:03:26.913 回答
3

准备中

我们首先需要至少知道 URL 和charset. 这些参数是可选的,取决于功能要求。

String url = "http://example.com";
String charset = "UTF-8";
String param1 = "value1";
 String param2 = "value2";
// ...
 String query = String.format("param1=%s&param2=%s", 
 URLEncoder.encode(param1, charset), 
 URLEncoder.encode(param2, charset));

查询参数必须采用 name=value 格式并由 & 连接。您通常还会使用指定的charsetusing对查询参数进行 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().

顺便说一句,它几乎是来自以下问题的复制粘贴

使用 java.net.URLConnection 触发和处理 HTTP 请求

于 2012-08-16T06:06:11.660 回答