java - 从一台服务器到另一台服务器的 POST 请求

标签 java playframework playframework-2.0

场景如下。 我在我的服务器上收到一个请求,对其进行一些处理,然后我需要根据我的处理在另一台服务器上发出请求,然后根据我从远程服务器获得的内容构建响应。 它是在 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&param2=%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/

相关文章:

javascript - 举起,玩耍!或 BlueEyes(带有一堆 Javascript 框架)

Scala 类型不匹配

Java 编译器 : Optimization of "cascaded" ifs and best practices?

java - 比较 sysdate 和当前日期以进行重新安排

scala - Play Framework 中的对列表

scala - 如何更改 Play、SBT 及其插件使用的 Scala 版本?

java - Play 框架中的 onError() 之后没有发送任何结果

windows-services - 在 Windows 上 Play Framework 2 阶段任务, "The input line is too long"

java - 有没有办法通过锁定屏幕启动 Activity ?

java - fragment 未按预期显示/隐藏