在Java程序中,可以創建表示URL地址的URL對象。
URL類中有各種用於獲取屬性的方法:
getProtocol
getHost
getPort
getFile
爲獲得URL的實際比特或內容信息,用它的openConnection()方法從它創建一個URLConnection對象,與調用URL對象相關,它返回一個URLConnection對象。它可能引發IOException異常。
URLConnection是訪問遠程資源屬性的一般用途的類。如果你建立了與遠程服務器之間的連接,你可以在傳輸它到本地之前用URLConnection來檢查遠程對象的屬性。這些屬性由HTTP協議規範定義並且僅對用HTTP協議的URL對象有意義。
URLConnection和HttpURLConnection使用的都是Java.net中的類,屬於標準的java接口。
HttpURLConnection繼承自URLConnection,差別在與HttpURLConnection僅僅針對Http連接。
1) 創建 URL 以及 URLConnection / HttpURLConnection 對象
2) 設置連接參數
3) 連接到服務器
4) 向服務器寫數據
5)從服務器讀取數據
代碼如下:
public void urlConnection()
{
String urltext = "";
try {
// 方法一:
URL url = new URL(urltext);
URLConnection conn = url.openConnection();//取得一個新的鏈接對指定的URL
conn.connect();//本方法不會自動重連
InputStream is = conn.getInputStream();
is.close();//關閉InputStream
// 方法二:
URL url2 = new URL(urltext);
InputStream is2 = url2.openStream();
is2.close();//關閉InputStream
//URL對象也提供取得InputStream的方法。URL.openStream()會打開自動鏈接,所以不需要運行openConnection
//方法三:本方法同一,但是openConnection返回值直接轉爲HttpsURLConnection,
//這樣可以使用一些Http連接特有的方法,如setRequestMethod
URL url3 = new URL(urltext);
HttpsURLConnection conn3 =(HttpsURLConnection)url.openConnection();
conn3.setRequestMethod("POST");
//允許Input、Output,不使用Cache
conn3.setDoInput(true);
conn3.setDoOutput(true);
conn3.setUseCaches(false);
/*
* setRequestProperty
*/
conn3.setRequestProperty("Connection", "Keep-Alive");
conn3.setRequestProperty("Charset", "UTF-8");
conn3.setRequestProperty("Content-type", "multipart/form-data;boundary=*****");
//在與服務器連接之前,設置一些網絡參數
conn3.setConnectTimeout(10000);
conn3.connect();
// 與服務器交互:向服務器端寫數據,這裏可以上傳文件等多個操作
OutputStream outStream = conn3.getOutputStream();
ObjectOutputStream objOutput = new ObjectOutputStream(outStream);
objOutput.writeObject(new String("this is a string…"));
objOutput.flush();
// 處理數據, 取得響應內容
InputStream is3 = conn.getInputStream();
is3.close();//關閉InputStream
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
其中conn的getInputStream與url.openStream是等效的,源碼如下
public final InputStream openStream() throws java.io.IOException
{
return openConnection().getInputStream();
}
使用url鏈接發送get和post請求
下面是摘自網上的簡單的使用url鏈接請求網絡資源的方式
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlName = url + "?" + param;
URL realUrl = new URL(urlName);
// 打開和URL之間的連接
URLConnection conn = realUrl.openConnection();
// 設置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 建立實際的連接
conn.connect();
// 獲取所有響應頭字段
Map<String, List<String>> map = conn.getHeaderFields();
// 遍歷所有的響應頭字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定義BufferedReader輸入流來讀取URL的響應
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += "/n" + line;
}
} catch (Exception e) {
System.out.println("發送GET請求出現異常!" + e);
e.printStackTrace();
}
// 使用finally塊來關閉輸入流
finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
/**
* 向指定URL發送POST方法的請求
*
* @param url
* 發送請求的URL
* @param param
* 請求參數,請求參數應該是name1=value1&name2=value2的形式。
* @return URL所代表遠程資源的響應
*/
public static String sendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打開和URL之間的連接
URLConnection conn = realUrl.openConnection();
// 設置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 發送POST請求必須設置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
// 獲取URLConnection對象對應的輸出流
out = new PrintWriter(conn.getOutputStream());
// 發送請求參數
out.print(param);
// flush輸出流的緩衝
out.flush();
// 定義BufferedReader輸入流來讀取URL的響應
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += "/n" + line;
}
} catch (Exception e) {
System.out.println("發送POST請求出現異常!" + e);
e.printStackTrace();
}
// 使用finally塊來關閉輸出流、輸入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}