Java中可以使用HttpURLConnection來(lái)請(qǐng)求WEB資源。
1、 URL請(qǐng)求的類(lèi)別
分為二類(lèi),GET與POST請(qǐng)求。二者的區(qū)別在于:
a:) get請(qǐng)求可以獲取靜態(tài)頁(yè)面,也可以把參數(shù)放在URL字串后面,傳遞給servlet,
2、URLConnection的對(duì)象問(wèn)題
- URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro.do");
- URLConnection rulConnection = url.openConnection();// 此處的urlConnection對(duì)象實(shí)際上是根據(jù)URL的
- // 請(qǐng)求協(xié)議(此處是http)生成的URLConnection類(lèi)
- // 的子類(lèi)HttpURLConnection,故此處最好將其轉(zhuǎn)化
- // 為HttpURLConnection類(lèi)型的對(duì)象,以便用到
- // HttpURLConnection更多的API.如下:
- HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;
3、HttpURLConnection對(duì)象參數(shù)問(wèn)題
- // 設(shè)置是否向httpUrlConnection輸出,因?yàn)檫@個(gè)是post請(qǐng)求,參數(shù)要放在
- // http正文內(nèi),因此需要設(shè)為true, 默認(rèn)情況下是false;
- httpUrlConnection.setDoOutput(true);
- // 設(shè)置是否從httpUrlConnection讀入,默認(rèn)情況下是true;
- httpUrlConnection.setDoInput(true);
- // Post 請(qǐng)求不能使用緩存
- httpUrlConnection.setUseCaches(false);
- // 設(shè)定傳送的內(nèi)容類(lèi)型是可序列化的java對(duì)象
- // (如果不設(shè)此項(xiàng),在傳送序列化對(duì)象時(shí),當(dāng)WEB服務(wù)默認(rèn)的不是這種類(lèi)型時(shí)可能拋java.io.EOFException)
- httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");
- // 設(shè)定請(qǐng)求的方法為"POST",默認(rèn)是GET
- httpUrlConnection.setRequestMethod("POST");
- // 連接,從上述第2條中url.openConnection()至此的配置必須要在connect之前完成,
- httpUrlConnection.connect();
4、HttpURLConnection連接問(wèn)題
- // 此處getOutputStream會(huì)隱含的進(jìn)行connect(即:如同調(diào)用上面的connect()方法,
- // 所以在開(kāi)發(fā)中不調(diào)用上述的connect()也可以)。
- OutputStream outStrm = httpUrlConnection.getOutputStream();
5、HttpURLConnection寫(xiě)數(shù)據(jù)與發(fā)送數(shù)據(jù)問(wèn)題
- // 現(xiàn)在通過(guò)輸出流對(duì)象構(gòu)建對(duì)象輸出流對(duì)象,以實(shí)現(xiàn)輸出可序列化的對(duì)象。
- ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);
- // 向?qū)ο筝敵隽鲗?xiě)出數(shù)據(jù),這些數(shù)據(jù)將存到內(nèi)存緩沖區(qū)中
- objOutputStrm.writeObject(new String("我是測(cè)試數(shù)據(jù)"));
- // 刷新對(duì)象輸出流,將任何字節(jié)都寫(xiě)入潛在的流中(些處為ObjectOutputStream)
- objOutputStm.flush();
- // 關(guān)閉流對(duì)象。此時(shí),不能再向?qū)ο筝敵隽鲗?xiě)入任何數(shù)據(jù),先前寫(xiě)入的數(shù)據(jù)存在于內(nèi)存緩沖區(qū)中,
- // 在調(diào)用下邊的getInputStream()函數(shù)時(shí)才把準(zhǔn)備好的http請(qǐng)求正式發(fā)送到服務(wù)器
- objOutputStm.close();
- // 調(diào)用HttpURLConnection連接對(duì)象的getInputStream()函數(shù),
- // 將內(nèi)存緩沖區(qū)中封裝好的完整的HTTP請(qǐng)求電文發(fā)送到服務(wù)端。
- InputStream inStrm = httpConn.getInputStream(); // <===注意,實(shí)際發(fā)送請(qǐng)求的代碼段就在這里
- // 上邊的httpConn.getInputStream()方法已調(diào)用,本次HTTP請(qǐng)求已結(jié)束,下邊向?qū)ο筝敵隽鞯妮敵鲆褵o(wú)意義,
- // 既使對(duì)象輸出流沒(méi)有調(diào)用close()方法,下邊的操作也不會(huì)向?qū)ο筝敵隽鲗?xiě)入任何數(shù)據(jù).
- // 因此,要重新發(fā)送數(shù)據(jù)時(shí)需要重新創(chuàng)建連接、重新設(shè)參數(shù)、重新創(chuàng)建流對(duì)象、重新寫(xiě)數(shù)據(jù)、
- // 重新發(fā)送數(shù)據(jù)(至于是否不用重新這些操作需要再研究)
- objOutputStm.writeObject(new String(""));
- httpConn.getInputStream();
6、post參數(shù)的方法
- OutputStream os = httpConn.getOutputStream();
- String param = new String();
- param = "CorpID=" + CorpID +
- "&LoginName=" + LoginName+
- "&send_no=" + phoneNumber +
- "&msg=" + java.net.URLEncoder.encode(msg,"GBK"); ;
- os.write(param.getBytes());