1

Javaを使用してレポートシステムにログインしようとしています。これまで、HttpURLConnectionを使用したさまざまな実装を試しました。私が投稿しようとしているHTMLは、要約すると次のようになります。

<form name="logonForm" method="POST" action="http://remoteserver/logon.object">
<input type="hidden" name="qryStr" value=""> 
<input type="hidden" name="cmsVisible" value="true"> 
<input type="hidden" name="authenticationVisible" value="true"> 
<input type="hidden" name="referer" value="">
<input type="hidden" name="refererFormData" value="">
<input type="hidden" name="isFromLogonPage" value="true">
<input type="text" name="cms" value="xxxxx" class="textfield" id="apsTextEdit">
<input type="text" name="username" value="xxxxx"class="textfield" id="usernameTextEdit">
<input type="text" name="password" value="xxxxx"class="textfield" id="passwordTextEdit">
<select name="authType"id="authenticationSelectBox">
<option selected value='xxxxx'>xxxxx</select>
<input type="submit" name="SUBMIT">
</form>

ブラウザで[送信]をクリックすると、レポートシステムにログインするため、このフォームが有効な入力を提供することはわかっています。ただし、プログラムによるリクエストを送信すると、応答として上記のhtmlが常に返されます。HttpURLRequestを使用した約100万の実装を試したことに注意してください。一例:

        OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
        wr.write(parameters);
        wr.flush();

        // Get the response
        BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line;
        String allLines = "";
        while ((line = rd.readLine()) != null) {
            allLines += "\n" + line; // Process line...
        }
        wr.close();
        rd.close();
        return allLines;

'parameters'は、何もないものから、投稿したHTMLのすべてのURLエンコードされたパラメーターまでの範囲であり、接続は(現在、他の構成を試したように)次のように設定されています。

        connection = (HttpURLConnection) url.openConnection();
        HttpURLConnection.setFollowRedirects(true);
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod("POST");
        connection.setAllowUserInteraction(false);
        connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=" + "UTF-8");
        connection.setUseCaches(false);
        connection.connect();

詳細が少しまばらであることを知っているので、さらに情報が必要な場合はお知らせください。ご入力いただきありがとうございます。

4

2 に答える 2

2

すべての要素のペアと、クエリ文字列でプログラムで「押す」要素のname=valueペアも取得する必要があります。ボタンには名前しかありませんが、それでも、ボタンを渡す必要があります。このようにして、サーバー側はボタンが押されたかどうか、押された場合はどれかを区別できます。 <input type="hidden"><input type="submit">

さらに、フォームにセッションが必要な場合(リクエストベースのトークンを使用する場合があります)、Cookieも自分で管理する必要があります。Set-Cookie最初の応答のヘッダーを確認して取得しCookie、それを後続の要求のヘッダーとして設定します。

より簡単で冗長でないHTTP/フォーム処理については、ApacheHttpComponentsクライアントを検討してください。

参照:

于 2010-06-22T13:11:44.793 に答える
1

特定の状況では、コードがデッドロックする可能性があります。入力から読み取る前に、出力を閉じる必要があります。ストリームを閉じないと、サーバーはリクエストが完了したことを認識しません。

何らかの理由で出力を開いたままにする必要がある場合は、「Content-length」ヘッダーを送信して、サーバーに期待する量を通知する必要があります。

パラメータは適切にエンコードする必要があります。私は通常、地図を入れて、このようにシリアル化します。

            StringBuilder sb = new StringBuilder(baseUrl);

            for (Parameter p : parameters) {
                    if (sb.length() > 0)
                        sb.append('&');
                    try {
                            sb.append(URLEncoder.encode(p.name, "UTF-8"));
                            if (p.value != null) {
                                sb.append('=');
                                sb.append(URLEncoder.encode(p.value, "UTF-8"));
                            }
                    } catch (UnsupportedEncodingException e) {
                        // Not really possible, throw unchecked exception
                        throw new IllegalStateException("No UTF-8");
                    }
            }

投稿するパラメータを把握する最良の方法は、ブラウザで投稿のトレースをキャプチャし、ブラウザがそれをどのように実行するかを確認することです。FireBug/DebugBarはあなたの友達です。

于 2010-06-22T14:25:06.807 に答える