5

<h:form>コンポーネントを使用して別のサーバーに HTTP ポスト リクエストを送信したいと考えています。

<form>HTMLコンポーネントを使用して外部サイトに 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>ますか?

4

1 に答える 1

7

<h:form>別のサーバーに送信するために使用することはできません。デフォルトでは、現在の<h:form>リクエストURLに送信されます。また、フォーム識別子やJSFビューステートなどの非表示の入力フィールドが自動的に追加されます。また、入力フィールド名で表されるようにリクエストパラメータ名を変更します。これはすべて、外部サーバーに送信するには不適切です。

を使用するだけ<form>です。JSFページでプレーンHTMLを完全にうまく使用できます。


更新:コメントによると、実際の問題は、投稿先のWebサービスから取得したzipファイルを処理する方法がわからず、実際に間違った方向で解決策を探していたということです。

JSF<h:form>を使い続け、通常のクライアントAPIを使用してWebサービスに送信し、ZIPファイルを次のフレーバーで取得したらInputStream(コメントに示されているようにラップしないReaderでください。zipファイルは文字コンテンツではなくバイナリコンテンツです)、次のようにして、HTTP応答本文に書き込みExternalContext#getResponseOutputStream()ます。

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();
}

参照:

于 2013-02-05T17:01:48.417 に答える