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