1.簡(jiǎn)介:
HTTP協(xié)議(HyperText Transfer Protocol门怪,超文本傳輸協(xié)議)是因特網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)傳輸協(xié)議免姿,所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)丰歌。 用于客戶端和服務(wù)器之間的通信。
2.URL簡(jiǎn)介:
以:http://127.0.0.1/test.php?name=yk&passward=123 為例子講解:
- 協(xié)議部分:該URL的協(xié)議部分為“http:”机断,這代表網(wǎng)頁(yè)使用的是HTTP協(xié)議畸颅。在”HTTP”后面的“//”為分隔符
- 域名部分:該URL的域名部分為“127.0.0.1”。
- 端口部分:跟在域名后面的是端口讨衣,域名和端口之間使用“:”作為分隔符换棚。如果使用默認(rèn)端口(80端口),可以不再URL中寫(xiě)出來(lái)(在Web瀏覽器中反镇,默認(rèn)使用的端口號(hào)是HTTP的80端口和HTTPS的443端口)
- 虛擬目錄部分:從域名后的第一個(gè)“/”開(kāi)始到最后一個(gè)“/”為止固蚤,是虛擬目錄部分。虛擬目錄也不是一個(gè)URL必須的部分歹茶。
- 文件名部分:從域名后的最后一個(gè)“/”開(kāi)始到“夕玩?”為止你弦,是文件名部分,如果沒(méi)有“?”,則是從域名后的最后一個(gè)“/”開(kāi)始到“#”為止风秤,是文件部分鳖目,如果沒(méi)有“?”和“#”缤弦,那么從域名后的最后一個(gè)“/”開(kāi)始到結(jié)束领迈,都是文件名部分。本例中的文件名是“test.php”碍沐。文件名部分也不是一個(gè)URL必須的部分狸捅,如果省略該部分,則使用默認(rèn)的文件名
- 錨部分:從“#”開(kāi)始到最后累提,都是錨部分尘喝。錨部分也不是一個(gè)URL必須的部分
- 參數(shù)部分:從“?”開(kāi)始到“#”為止之間的部分為參數(shù)部分斋陪,又稱搜索部分朽褪、查詢部分。本例中的參數(shù)部分為“name=yk&passward=123”无虚。參數(shù)可以允許有多個(gè)參數(shù)缔赠,參數(shù)與參數(shù)之間用“&”作為分隔符。
3.HTTP的響應(yīng)狀態(tài)碼:
狀態(tài)碼是服務(wù)器端返回客戶端服務(wù)器端處理請(qǐng)求的結(jié)果友题。狀態(tài)碼是由3位數(shù)字加原因短語(yǔ)組成嗤堰。3位數(shù)字中的第一位是用來(lái)指定狀態(tài)的類別。
1. 200:OK
請(qǐng)求被正常的處理成功
2. 400:Bad Request
400表示請(qǐng)求報(bào)文中存在語(yǔ)法錯(cuò)誤度宦。需要修改后再次發(fā)送踢匣。
3. 403:Forbidden
表明請(qǐng)求訪問(wèn)的資源被拒絕了。沒(méi)有獲得服務(wù)器的訪問(wèn)權(quán)限戈抄,IP被禁止等离唬。
4. 404:Not Found
請(qǐng)求的資源在服務(wù)器上找不到。
5. 500:Internal Server Error
服務(wù)器端在執(zhí)行請(qǐng)求時(shí)發(fā)生了錯(cuò)誤划鸽,可能是服務(wù)端程序的Bug或者臨時(shí)故障男娄。
6. 503:Service Unavailable
服務(wù)器暫時(shí)處于超負(fù)載或正在進(jìn)行停機(jī)維護(hù),現(xiàn)在無(wú)法處理請(qǐng)求漾稀。如果事先得知解除以上狀況需要的時(shí)間,最好寫(xiě)入Retry-After字段再返回給客戶端建瘫。
7. 504:Getaway Timeout
網(wǎng)關(guān)超時(shí)崭捍,是代理服務(wù)器等待應(yīng)用服務(wù)器響應(yīng)時(shí)的超時(shí)。
更多狀態(tài)碼:http://tool.oschina.net/commons?type=5
4.HTTP請(qǐng)求方法:
請(qǐng)求方法是客戶端向服務(wù)器端請(qǐng)求數(shù)據(jù)的方法啰脚,就像下達(dá)命令一樣殷蛇。請(qǐng)求方法有很多種实夹,主要介紹下面3種:
1.GET:獲取資源
GET方法用來(lái)請(qǐng)求訪問(wèn)已被URI識(shí)別的資源。也就是指定了服務(wù)器處理請(qǐng)求之后響應(yīng)的內(nèi)容粒梦。
2.POST:傳輸實(shí)體主體
用于在服務(wù)器上創(chuàng)建新的資源亮航,或者執(zhí)行非冪等操作。在POST請(qǐng)求中匀们,服務(wù)器端通常會(huì)為新創(chuàng)建的資源分配一個(gè)URI缴淋,并將其包含在響應(yīng)中返回給客戶端。
3.PUT:傳輸文件
用于向服務(wù)器端傳送數(shù)據(jù)泄朴,以更新現(xiàn)有資源的狀態(tài)重抖。在PUT請(qǐng)求中,客戶端提供完整的資源表示祖灰,服務(wù)器端使用該表示來(lái)更新目標(biāo)資源钟沛。
5. POST、Get方法的區(qū)別:
- post方法比get方法安全:Get將表單中數(shù)據(jù)添加到action所指向的URL后面局扶,并且兩者使用“?”連接恨统,而各個(gè)變量之間使用 “&”連接;Post是將表單中的數(shù)據(jù)放在form的數(shù)據(jù)體中三妈,按照變量和值相對(duì)應(yīng)的方式畜埋,傳遞到action所指向URL。
- Get傳輸?shù)臄?shù)據(jù)量小沈跨,這主要是因?yàn)槭躑RL長(zhǎng)度限制由捎;而Post可以傳輸大量的數(shù)據(jù)。
- Get是Form的默認(rèn)方法饿凛。
使用post上傳數(shù)據(jù):
public static void postImage()throws IOException{
URL url = new URL("http://127.0.0.1/test.php");
//http://127.0.0.1/test.php:這是我自己用Apache服務(wù)器搭建的后臺(tái)中的test.php文件
// 獲取connection對(duì)象
// HttpURLConnection:自己設(shè)定請(qǐng)求的內(nèi)容 請(qǐng)求的方式 上傳的內(nèi)容(其他時(shí)候一般使用URLconnection)
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 設(shè)置post請(qǐng)求方式
connection.setRequestMethod("POST");
// 設(shè)置有輸出流狞玛,需要上傳
connection.setDoOutput(true);
// 設(shè)置有輸入流,需要下載
connection.setDoInput(true);
// 準(zhǔn)備上傳的數(shù)據(jù)
String data = "user_name=yk&user_passward=123";
// 開(kāi)始上傳
OutputStream os = connection.getOutputStream();
os.write(data.getBytes());
// 寫(xiě)完了
os.flush();
// 接收服務(wù)器端返回的數(shù)據(jù)
InputStream is = connection.getInputStream();
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf)) != -1){
System.out.println(new String(buf,0,len));
}
}
打印結(jié)果:
用戶名:yk密碼:123
http://127.0.0.1/test.php:這是我自己用Apache服務(wù)器搭建的后臺(tái)中的test.php文件涧窒,代碼如下:
<?php
$name = $_POST["user_name"];
$passward = $_POST["user_passward"];
echo "用戶名:".$name. "密碼:".$passward;
?>
使用get下載圖片:
public static void getImage()throws IOException{
URL url = new URL("https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1928030112,980393754&fm=26&gp=0.jpg");
// 獲取服務(wù)器連接到的對(duì)象
URLConnection connection = url.openConnection();
// 讀取下載的數(shù)據(jù)
InputStream is = connection.getInputStream();
// 創(chuàng)建圖片保存的位置
FileOutputStream fos = new FileOutputStream("C:\\JavaCode\\0805-1\\jave\\src\\main\\java\\day15\\URL\\1.jpg");
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf)) != -1){
fos.write(buf,0,len);
System.out.println(len);
}
System.out.println("下好了");
}