我想使用<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下载的文件