我需要做的是將Java直接導入到HTTPS網頁,接受所有證書,填寫表單,通過POST提交數據,然後輸出結果頁面。在Java中這怎麼可能(特別是在Android應用程序的範圍內)?使用Java輸入並向HTTPS網站提交POST表單
我從「http://alien.dowling.edu/~vassil/tutorials/javapost.php」和Kevin的答案「http://stackoverflow.com/questions/1828775/httpclient-」中彙總了下面的代碼-ssl「,但打印BufferedReader只打印填充信息而不是結果頁面源的表單。
調用提交時,使用JavaScript在頁面上運行腳本,並且URL本身不會更改,但頁面內容確實會更改以反映腳本的返回結果。但是,當前程序仍然不會返回新更新頁面的來源。 - Paradius剛纔
你們中的任何人都可以告訴我這段代碼出錯的地方嗎?提前致謝!
import java.io.*;
import java.net.*;
import javax.net.ssl.*;
import java.util.*;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class JavaPOST
{
public static void doSubmit(String url, Map<String, String> data) throws Exception
{
//SSL Certificate Acceptor
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
SSLContext.setDefault(ctx);
URL siteUrl = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection)siteUrl.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setHostnameVerifier(
new HostnameVerifier()
{
@Override
public boolean verify(String arg0, SSLSession arg1)
{
return true;
}
});
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
Set keys = data.keySet();
Iterator keyIter = keys.iterator();
String content = "";
for(int i=0; keyIter.hasNext(); i++)
{
Object key = keyIter.next();
if(i!=0)
{
content += "&";
}
content += key + "=" + URLEncoder.encode(data.get(key), "UTF-8");
}
//System.out.println(content);
out.writeBytes(content);
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
while((line=in.readLine())!=null)
{
System.out.println(line);
}
System.out.println(conn.getURL());
}
public static void main(String[] args)
{
Map<String, String> data = new HashMap<String, String>();
data.put("start_time", "103000");
data.put("end_time", "210000");
try
{
doSubmit("https://somedomain/webpage.html", data);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class DefaultTrustManager implements X509TrustManager
{
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
事實證明,我忘記提到當調用submit時,使用JavaScript在頁面上運行腳本,並且URL本身不會更改,但頁面內容確實會發生變化以反映腳本的返回結果。但是,當前程序仍然不會返回新更新頁面的來源。 – Paradius
那麼,你的Android客戶端對JavaScript一無所知,所以它不可能得到結果。如果您需要運行腳本,則可能需要使用WebView。 –
如果頁面本身運行腳本頁面將用戶重定向到同一頁面但具有不同的外觀並因此具有不同的來源,那麼這甚至是真的嗎? – Paradius