POST请求从一个服务器到另一个服务器

时间:2012-08-16 05:47:17

标签: java playframework playframework-2.0

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

2 个答案:

答案 0 :(得分:3)

<强>准备

我们首先需要至少知道网址和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格式,并且由&amp;连接。您通常还会使用charset对指定的URLEncoder#encode()对查询参数进行URL编码。

String#format()只是为了方便起见。当我需要String连接运算符+两次以上时,我更喜欢它。

使用(可选)查询参数触发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();
  // ...

无论哪种方式,如果另一方是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对。 d喜欢以编程方式“按”(因为通常在服务器端使用它来区分是否按下按钮,如果是,则按哪一个)。

您还可以将获得的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

答案 1 :(得分: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 documentation中的更多信息。