【问题标题】:Send HTTP POST request to external site using <h:form>使用 <h:form> 向外部站点发送 HTTP POST 请求
【发布时间】:2013-02-05 16:50:34
【问题描述】:

我想使用&lt;h:form&gt; 组件向另一台服务器发送 HTTP 发布请求。

我可以使用 HTML &lt;form&gt; 组件向外部站点发送 POST 请求,但 &lt;h:form&gt; 组件不支持此功能。

<form action="http://www.test.ge/get" method="post">
    <input type="text" name="name" value="test"/>
    <input type="submit" value="CALL"/>
</form>

如何使用&lt;h:form&gt; 实现这一目标?

【问题讨论】:

  • @BalusC 啊,感谢您清理它。问题对我来说似乎有点困惑:P

标签: jsf primefaces


【解决方案1】:

不能使用&lt;h:form&gt; 提交到另一台服务器。 &lt;h:form&gt; 默认提交到当前请求的 URL。此外,它会自动添加额外的隐藏输入字段,例如表单标识符和 JSF 视图状态。此外,它会更改由输入字段名称表示的请求参数名称。这一切都会使它不适合将其提交给外部服务器。

只需使用&lt;form&gt;。您可以在 JSF 页面中完美地使用纯 HTML。


更新:根据 cmets,您的实际问题是您不知道如何处理从您发布的网络服务获得的 zip 文件您实际上正在寻找错误方向的解决方案。

只要继续使用 JSF &lt;h:form&gt; 并使用其通常的客户端 API 提交到 Web 服务,一旦您获得了 InputStream 风格的 ZIP 文件(请不要将其包装为 Reader,如您的评论中所示, zip 文件是二进制内容而不是字符内容),只需通过ExternalContext#getResponseOutputStream() 将其写入 HTTP 响应正文,如下所示:

public void submit() throws IOException {
    InputStream zipFile = yourWebServiceClient.submit(someData);
    String fileName = "some.zip";

    FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();
    ec.responseReset();
    ec.setResponseContentType("application/zip");
    ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
    OutputStream output = ec.getResponseOutputStream();

    try {
        byte[] buffer = new byte[1024];
        for (int length = 0; (length = zipFile.read(buffer)) > 0;) {
            output.write(buffer, 0, length);
        }
    } finally {
        try { output.close(); } catch (IOException ignore) {}
        try { zipFile.close(); } catch (IOException ignore) {}
    }

    fc.responseComplete();
}

另见:

【讨论】:

  • 但在 html
    如何使用托管 bean,我想使用 组件并希望这是 dinamicali。 我从数据库中获取的组件内容以及如何使用 html 获取?
  • 只使用纯 HTML。另一种选择是在 bean 的 action 方法中发送重定向。您的具体问题仍然难以理解。您是否想拥有 PrimeFaces 组件的外观?
  • 我想调用 Web 服务,它只适用于 http post 方法。当我从浏览器调用网络服务时,我提交表单参数时,我从网络服务获取 zip 文件并下载 zip。我尝试调用 web 服务 java 端,但后来我得到了 BufferedReader 对象,不知道如何转换 zip 文件中的对象并下载。
  • 哦,如果这是您的真正问题,请写信给ExternalContext#getResponseOutputStream()。请参阅更新的答案。您应该只修复它,以便不要将其包装在 Reader 中,而是将其包装在 InputStream 中。否则你会得到一个损坏的文件。
  • 非常感谢帮助,我不知道 FacesContext fc = FacesContext.getCurrentInstance(); ExternalContext ec = fc.getExternalContext();现在我知道了:) 谢谢
猜你喜欢
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 2015-09-20
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多