有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (2) 个答案

  1. # 1 楼答案

    要从播放服务器调用请求,应该使用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

  2. # 2 楼答案

    准备

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

    字符串#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();
      // ...
    

    无论哪种方式,如果另一端是HttpServlet,那么它的doGet()方法将被调用,参数将由HttpServletRequest#getParameter()提供。 使用查询参数触发HTTP POST请求:

    使用查询参数触发HTTP POST请求:

    URLConnection#setDoOutput()设置为true会隐式地将请求方法设置为POST。标准的HTTP POST as web froms do类型为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");
      // ...
    

    无论哪种方式,如果另一端是HttpServlet,那么它的doPost()方法将被调用,参数将由HttpServletRequest#getParameter()提供

    顺便说一下,这几乎是下面问题的复制粘贴

    Using java.net.URLConnection to fire and handle HTTP requests