使用 <h:form 将 HTTP POST 请求发送到外部站点>



我想使用<h:form>组件向另一台服务器发送HTTP post请求。

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

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

如何使用<h:form>实现这一点?

无法使用<h:form>提交到另一台服务器。默认情况下,<h:form>提交到当前请求URL。此外,它还会自动添加额外的隐藏输入字段,如表单标识符和JSF视图状态。此外,它还将更改由输入字段名称表示的请求参数名称。这一切都会使它无法将其提交给外部服务器。

只需使用<form>。您可以在JSF页面中完美地使用纯HTML。


更新:根据评论,您的实际问题是,您不知道如何处理从您发布到的Web服务中获得的zip文件,并且您实际上在错误的方向上寻找解决方案。

只需继续使用JSF <h:form>,并使用其通常的客户端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();
}

另请参阅:

  • 如何提供从JSF支持bean下载的文件

相关内容

  • 没有找到相关文章

最新更新