運用Java進行Http表單數據自動提交
統一的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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!