運用Java進行Http表單數據自動提交

jopen 9年前發布 | 2K 次閱讀 Java

統一的URL編碼


package demo0808.demo2;
/**
 * 由于網絡上HTTP的POST請求需要進行編碼
 * 以此來適應不同的操作系統
 * 編碼成統一的ASCII字符
 * 本類對Query語句進行URL編碼
 * 鍵值對中間用=連接
 * 不同的鍵值對用&連接
 */
import java.net.URLEncoder;

public class QueryString {
private StringBuilder query=new StringBuilder();
private String charset="UTF-8";
    /**
     * 無參默認構造函數
     */
    public QueryString() {
    }
    /**
     *  同步添加鍵值對
     * @param name 參數名稱
     * @param value 參數值
     */
    public synchronized void add(String name,String value) {
        query.append('&');
        encode(name,value);
    }
    /**
     * 同步進行URL編碼
     * @param name 參數名稱
     * @param value 參數值
     */
    private synchronized void encode(String name,String value) {
        try {
            query.append(URLEncoder.encode(name, charset));
            query.append('=');
            query.append(URLEncoder.encode(value,charset));
        } catch (Exception ex) {
            System.err.println("Bad VM can't support "+charset);
        }
    }
    /**
     * 同步獲取查詢字符串
     * @return 字符串
     */
    public synchronized String getQuery() {
        return query.toString();
    }
    /**
     * 覆蓋toString()方法
     */
    public String toString() {
        return getQuery();
    }
}


基于Http的post請求鍵值對填寫


package demo0808.demo2;
/**
 * 針對HTTP協議的POST請求
 * 表單自動填寫
 * 不考慮驗證碼識別
 * 不考慮https類型的協議
 */
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;

public class FormPoster {
    private URL url;
    private QueryString queryString=new QueryString() ;
    /**
     * 構造函數
     * @param url 統一資源位置符號
     */
    public FormPoster(URL url) {
        if(!url.getProtocol().toLowerCase().startsWith("http")) {
            System.err.println("Post只用于http協議!");
            return;
        }
        this.url=url;
    }
    /**
     *  添加參數-值對
     * @param name 參數名稱
     * @param value 參數值
     */
    public void add(String name,String value) {
        queryString.add(name, value);
    }

    /**
     * 獲取URL
     * @return URL 
     */
    public URL getURL() {
        return url;
    }
    /**
     *  獲取網站相應的輸入流
     * @return 輸入流
     * @throws Exception 無法連接異常
     */
    public InputStream post() throws Exception {
        URLConnection openConnection = url.openConnection();
        openConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
        openConnection.setDoOutput(true);
        OutputStream outputStream = openConnection.getOutputStream();
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"UTF-8");
        outputStreamWriter.write(queryString.toString());
        outputStreamWriter.write("\r\n");
        outputStreamWriter.flush();
        outputStreamWriter.close(); //刷新關閉流很重要,只有關閉了,才能獲取輸入流
        return openConnection.getInputStream();
    }
}





測試代碼


package demo0808.demo2;
/**
 * 測試代碼
 */
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;

public class Test {

    public static void main(String[] args) throws Exception {
        URL url = new URL("https://uniportal.huawei.com/uniportal/login.do");
        FormPoster formPoster = new FormPoster(url);
        /**
         * 以下是測試華為招聘網站登陸界面
         */
        formPoster.add("actionFlag", "loginAuthenticate");
        formPoster.add("lang", "zh");
        formPoster.add("redirect", "http://career.huawei.com/recruitment/login_index.html?redirect=http://career.huawei.com/recruitment/");
        formPoster.add("uid", "用戶名");
        formPoster.add("password", "密碼`");
        InputStream inputStream = formPoster.post();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        File file=new File("outfile");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"UTF-8");
        int c;
        while((c=inputStreamReader.read())!=-1) {
            System.out.print((char)c);
            outputStreamWriter.write((char)c);
        }
        inputStream.close();
        outputStreamWriter.close();
        System.out.println();
    }
}



 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!