----- 最近更新時間【2021-12-14】-----
一楔壤、簡介
在HTTP協(xié)議下鹤啡,輸入輸出的原型其實(shí)是HTTP請求與響應(yīng),客戶端向服務(wù)器端發(fā)送的數(shù)據(jù)稱之為請求挺邀,反之稱為響應(yīng)揉忘。雖然HTTP/1.1定義了8種請求方法,但是最常用的卻只有這兩種方法——GET和POST端铛,它們都允許發(fā)送自定義數(shù)據(jù)給服務(wù)器端。因此疲眷,可以通過接收這兩種方法的請求數(shù)據(jù)禾蚕,來實(shí)現(xiàn)輸入。
二狂丝、GET
GET是HTTP中最原始的請求方式换淆,在網(wǎng)頁中點(diǎn)擊一個鏈接或在地址欄輸入一個URL就會發(fā)送一個GET請求。在GET請求中几颜,數(shù)據(jù)是在URL后面來發(fā)送的倍试,就好像這樣:http://www.xxx.com/request.php?name=nosee123
。
大部分傳輸?shù)綖g覽器的html蛋哭,images县习,js,css, … 都是通過GET方法發(fā)出請求的谆趾。它是獲取數(shù)據(jù)的主要方法躁愿。
GET提交方式屬于顯式提交,也就是我們提交信息時沪蓬,所提交的數(shù)據(jù)會顯示在url中彤钟,那么我們提交的數(shù)據(jù)是可以被用戶查看到的,當(dāng)然這些信息都是一些不重要的東西跷叉。
1逸雹、get請求方式
1)表單提交 get
如果form表單中不指定method营搅,默認(rèn)也是GET請求,form中提交的數(shù)據(jù)將會附加在url之后梆砸。
<form action = "test.php" method = "get">
<input type="text" name = 'name' value = 'nosee123'/>
<input type= 'submit' /> <input type= 'reeset' />
</form>
2)鏈接形式
<a herf="test.php?name=nosee123">這是個鏈接</a>
3)php中用方法 file_get_contents() 以get的方式獲取內(nèi)容
$url='http://www.jb51.net/';
$html = file_get_contents($url);
echo $html;
4)php中用方法 fopen() 打開url, 以get方式獲取內(nèi)容
$fp = fopen($url, 'r');
stream_get_meta_data($fp);
while(!feof($fp)) {
$result .= fgets($fp, 1024);
}
echo "url body: $result";
fclose($fp);
2剧防、注意:
當(dāng)使用GET方法發(fā)送數(shù)據(jù)時,則 <form>標(biāo)簽 action 屬性值中不能包含查詢字符串(即使包含也不會生效)
即:
<form action="post.php?act=login" method="get">
... ...
</form>
應(yīng)該改為:
<form action="post.php" method="get">
... ...
<input type="hidden" name="act" value="login">
</form>
三辫樱、POST
GET方法的本意就是下載(與其對應(yīng)的是上傳方法PUT)峭拘,因此并不是專門用于傳遞數(shù)據(jù)的,它將請求數(shù)據(jù)全部經(jīng)過URL編碼后附在url的后面狮暑。這樣一來鸡挠,當(dāng)數(shù)據(jù)多時url就會變得很長——但這并不是問題的所在,問題所在是一些WEB瀏覽器或服務(wù)器程序會限制這行字符串的長度搬男。這時拣展,就需要用到POST方法了。
顧名思義缔逛,POST方法的主要用途就是“傳遞”數(shù)據(jù)备埃,它將數(shù)據(jù)放在所有請求標(biāo)題的后面上傳,這樣一來褐奴,無論有多少數(shù)據(jù)上傳都不成問題了(這樣請求數(shù)據(jù)的大小之取決于WEB服務(wù)允許的尺寸了)按脚。通常來說,對于表單數(shù)據(jù)敦冬,如無特別需求都是使用POST方法來上傳辅搬,這樣就無須去擔(dān)心url的長度了。
1脖旱、post請求方式
1)表單提交post
<form action = "test.php" method = "post">
<input type="text" name = 'name' value = 'nosee123'/>
<input type= 'submit' /> <input type= 'reeset' />
</form>
2)php中用 file_get_contents() 函數(shù),以post方式獲取內(nèi)容
$data = array ('foo' => 'bar');
$data = http_build_query($data); // 生成 URL-encode 之后的請求字符串
$opts = array (
'http' => array (
'method' => 'POST',
'header'=> "Content-type: application/x-www-form-urlencodedrn" .
"Content-Length: " . strlen($data) . "\r\n",
'content' => $data
)
);
$context = stream_context_create($opts); // 創(chuàng)建資源流上下文
$html = file_get_contents('http://localhost/e/admin/test.html', false, $context);
echo $html;
3)使用curl庫模擬post或get請求
$url = "http://nosee123.com/test_post.php";
$post_data = array (
"name" => "nosee",
"url" => "http://www.nosee123.com",
"action" => "Submit"
);
$ch = curl_init($url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, 1); // 設(shè)置請求為post類型
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); // 添加post數(shù)據(jù)到請求中
$str = curl_exec($ch); // 執(zhí)行post請求堪遂,獲得回復(fù)
curl_close($ch);
echo $str ; //查看執(zhí)行結(jié)果
2、注意:
在默認(rèn)的情況下萌庆,post提交的信息最多不會超過8m溶褪,不過我們也可以在php.ini中修改post_max_size的值來進(jìn)行更改。
四践险、GET與POST的區(qū)別
- get是從服務(wù)器上獲取數(shù)據(jù)猿妈,post是向服務(wù)器傳送數(shù)據(jù)。
- post發(fā)送的數(shù)據(jù)量更大(理論上沒有大小限制捏境,但服務(wù)器端一般都有設(shè)置最大上傳大杏谟巍);
get有url長度限制垫言,傳輸?shù)臄?shù)據(jù)量蟹“(一般認(rèn)為不能大于2KB,因?yàn)槭躑RL長度限制)筷频,但效率較高蚌成。 - get是把參數(shù)數(shù)據(jù)隊(duì)列加到URL的后面前痘,在URL中可以看到;post是將表單內(nèi)各個字段與其內(nèi)容放置在Http請求的Headers內(nèi)一起傳送到指定的URL地址担忧,用戶看不到這個過程芹缔。
- get安全性非常低,post安全性較高瓶盛。但是get執(zhí)行效率卻比post方法好最欠。
- get限制form表單的數(shù)據(jù)集的值必須為ASCII字符;而POST支持整個ISO10646字符集惩猫,默認(rèn)是用ISO-8859-1編碼芝硬。
get限制Form表單的數(shù)據(jù)集的值必須為ASCII字符,不能通過request.setCharacterEncoding("utf-8")
設(shè)置中文字符轧房,服務(wù)器得到的中文字符可能為亂碼拌阴!post支持整個字符集ISO10646,可以通request.setCharacterEncoding("utf-8")
正確顯示中文字符奶镶。 - 在PHP中迟赃,POST方法的請求數(shù)據(jù)被封裝到了$_POST數(shù)組中,而GET方法的請求數(shù)據(jù)則被封裝到$_GET數(shù)組厂镇。
五纤壁、其它請求方式
1、HEAD:獲得報文首部
HEAD方法和GET方法一樣剪撬,只是不返回報文的主體部分摄乒,用于確認(rèn)URI的有效性及資源更新的日期時間等。
具體來說:1残黑、判斷類型; 2斋否、查看響應(yīng)中的狀態(tài)碼梨水,看對象是否存在(響應(yīng):請求執(zhí)行成功了,但無數(shù)據(jù)返回)茵臭; 3疫诽、測試資源是否被修改過
HEAD方法和GET方法的區(qū)別: GET方法有實(shí)體,HEAD方法無實(shí)體旦委。
2奇徒、PUT:傳輸文件
PUT方法用來傳輸文件,就像FTP協(xié)議的文件上傳一樣缨硝,要求在請求報文的主體中包含文件內(nèi)容摩钙,然后保存在請求URI指定的位置。但是HTTP/1.1的PUT方法自身不帶驗(yàn)證機(jī)制查辩,任何人都可以上傳文件胖笛,存在安全問題网持,故一般不用。
3长踊、DELETE:刪除文件
指明客戶端想讓服務(wù)器刪除某個資源功舀,與PUT方法相反,按URI刪除指定資源
4身弊、OPTIONS:詢問支持的方法
OPTIONS方法用來查詢針對請求URI指定資源支持的方法(客戶端詢問服務(wù)器可以提交哪些請求方法)
5辟汰、TRACE:追蹤路徑
客戶端可以對請求消息的傳輸路徑進(jìn)行追蹤,TRACE方法是讓W(xué)eb服務(wù)器端將之前的請求通信還給客戶端的方法
6阱佛、CONNECT:要求用隧道協(xié)議連接代理
CONNECT方法要求在與代理服務(wù)器通信時建立隧道帖汞,實(shí)現(xiàn)用隧道協(xié)議進(jìn)行TCP通信。主要使用SSL(安全套接層)和TLS(傳輸層安全)協(xié)議把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸瘫絮。
《THE END》