TML:完成頁(yè)面的內(nèi)容展示
CSS:完成頁(yè)面樣式的控制,美化頁(yè)面,完成頁(yè)面的布局。
表單:用于采集用戶輸入的數(shù)據(jù)。用于和服務(wù)器進(jìn)行交互。
form:用于定義表單的。可以定義一個(gè)范圍(代表用戶采集數(shù)據(jù)的范圍)
屬性:action:指定提交數(shù)據(jù)的url(指的就是把數(shù)據(jù)提交到哪里)
method:指定提交方式
分類:一共有7種,2種比較常用。
get:1.請(qǐng)求參數(shù)會(huì)在地址欄顯示
2.請(qǐng)求參數(shù)的長(zhǎng)度是有限制的。
3.請(qǐng)求不安全
post:1.請(qǐng)求參數(shù)不會(huì)在地址欄顯示,會(huì)封裝在請(qǐng)求體中。
2.請(qǐng)求參數(shù)的長(zhǎng)度沒(méi)有限制
3.較為安全
表單里面的數(shù)據(jù)要想被提交,必須指定它的name屬性
很多情況下,需要傳遞一些信息,從瀏覽器到Web服務(wù)器,最終到后臺(tái)程序?yàn)g覽器使用兩種方法可將這些信息傳遞到Web服務(wù)器,分別為Get方法和Post方法。
(1)Get方法
1)Get方法向后臺(tái)發(fā)送數(shù)據(jù)的格式:
Get 方法向頁(yè)面請(qǐng)求發(fā)送已編碼的用戶信息。頁(yè)面和已編碼的信息中間用 ? 字符分隔,如下所示:
http://www.test.com/hello?key1=value1&key2=value2
2)Get方法傳遞數(shù)據(jù)的注意事項(xiàng):
Get 方法是默認(rèn)的從瀏覽器向 Web 服務(wù)器傳遞信息的方法,它會(huì)產(chǎn)生一個(gè)很長(zhǎng)的字符串,出現(xiàn)在瀏覽器的地址欄中。如果您要向服務(wù)器傳遞的是密碼或其他的敏感信息,請(qǐng)不要使用 Get 方法。
Get 方法有大小限制:請(qǐng)求字符串中最多只能有 1024 個(gè)字符。
3)servlet處理get數(shù)據(jù)的方法:
這些信息使用 QUERY_STRING 頭傳遞,并可以通過(guò) QUERY_STRING 環(huán)境變量訪問(wèn),Servlet 使用 doGet()方法處理這種類型的請(qǐng)求。
(2)Post方法
另一個(gè)向后臺(tái)程序傳遞信息的比較可靠的方法是 POST 方法。
1)Post發(fā)送數(shù)據(jù)的形式:
Post 方法打包信息的方式與 Get 方法基本相同,但是 Post 方法不是把信息作為 URL 中 ? 字符后的文本字符串進(jìn)行發(fā)送,而是把這些信息作為一個(gè)單獨(dú)的消息。
2)servlet處理post數(shù)據(jù)的方法:
消息以標(biāo)準(zhǔn)輸出的形式傳到后臺(tái)程序,您可以解析和使用這些標(biāo)準(zhǔn)輸出。Servlet 使用 doPost() 方法處理這種類型的請(qǐng)求。
Servlet 處理表單數(shù)據(jù),這些數(shù)據(jù)會(huì)根據(jù)不同的情況使用不同的方法自動(dòng)解析:
getParameter():您可以調(diào)用 request.getParameter() 方法來(lái)獲取表單參數(shù)的值。
getParameterValues():如果參數(shù)出現(xiàn)一次以上,則調(diào)用該方法,并返回多個(gè)值,例如復(fù)選框。
getParameterNames():如果您想要得到當(dāng)前請(qǐng)求中的所有參數(shù)的完整列表,則調(diào)用該方法。
第一步:在webtest工程的src目錄下創(chuàng)建包:
com.web.test
第二步:在該包下創(chuàng)建類:HelloFormInGetUrl,代碼實(shí)例如下:
第三步:?jiǎn)?dòng)tomcat訪問(wèn),訪問(wèn)鏈接是:
http://localhost:8080/webtest/HelloFormInGetUrl?name=aaa&url=www.test.com
效果如下:
下面是一個(gè)簡(jiǎn)單的實(shí)例,使用 HTML 表單和提交按鈕傳遞兩個(gè)值。我們將使用相同的 Servlet(即上邊的HelloFormInGetUrl類)來(lái)處理輸入。
第一步:在webtest工程的src目錄下創(chuàng)建包:
com.web.test
第二步:在該包下創(chuàng)建類:HelloFormInPost,代碼實(shí)例如下:
第三步:在WebContent目錄下創(chuàng)建post.html
第四步:?jiǎn)?dòng)tomcat訪問(wèn),訪問(wèn)鏈接如下:
http://localhost:8080/webtest/post.html
效果如下:
第五步:在文本框中輸入信息,點(diǎn)擊提交,后如下:
首先說(shuō)一下為什么寫這篇文章,以前寫客戶端的時(shí)候,要經(jīng)常調(diào)用后端的接口,一般很多公司的接口,都是統(tǒng)一POST提交方式
服務(wù)端響應(yīng)的是 JSON 格式字符串,方便統(tǒng)一管理,當(dāng)時(shí)對(duì)POST不太清楚,開(kāi)始的時(shí)候,不覺(jué)得有啥
但是真正等到自己寫一個(gè)獨(dú)立的技術(shù)社區(qū)的時(shí)候,也就是 www.helloworld.net ,需要上傳,需要表單提交等
才發(fā)現(xiàn),不懂這些,用到了的時(shí)候,很是費(fèi)勁,很耽誤時(shí)間。
下面就當(dāng)是復(fù)習(xí)了,學(xué)習(xí)一下GET , POST 這兩種最常用的提交方式
HTTP 請(qǐng)求方法有9種,分別是
序號(hào) | 方法 | 描述 |
1 | GET | 請(qǐng)求指定的頁(yè)面信息,并返回實(shí)體主體。 |
2 | HEAD | 類似于 GET 請(qǐng)求,只不過(guò)返回的響應(yīng)中沒(méi)有具體的內(nèi)容,用于獲取報(bào)頭 |
3 | POST | 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST 請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。 |
4 | PUT | 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。 |
5 | DELETE | 請(qǐng)求服務(wù)器刪除指定的頁(yè)面。 |
6 | CONNECT | HTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。 |
7 | OPTIONS | 允許客戶端查看服務(wù)器的性能。 |
8 | TRACE | 回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。 |
9 | PATCH | 是對(duì) PUT 方法的補(bǔ)充,用來(lái)對(duì)已知資源進(jìn)行局部更新 。 |
最常用的還是 GET , POST
我們知道,http是一個(gè)通信協(xié)議,啥叫通信協(xié)議,通信嘛,就是兩個(gè)人要溝通,協(xié)議嘛,就是怎么溝通
比如我說(shuō)A,你知道我餓了想吃東西了,我再說(shuō) A 米飯, 你就知道我餓了,并且想吃米飯了。
對(duì)的,協(xié)議就是雙方提前商量好的溝通的內(nèi)容的格式
HTTP通信協(xié)議就是 HTTP客戶端和HTTP服務(wù)端 雙方規(guī)定好的格式
那么這個(gè)HTTP消息,有哪幾部分組成呢
很簡(jiǎn)單,HTTP消息包含兩部分
比如我們?cè)跒g覽器中發(fā)一個(gè)請(qǐng)求www.helloworld.net 回車,此時(shí)我們發(fā)的是GET請(qǐng)求
那么請(qǐng)求頭是:
GET / HTTP/2
Host: www.helloworld.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: Hm_lvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379; Hm_lpvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
If-None-Match: "d696-1nnZwKI6/LZalqvEzQx9IFil/tw"
TE: trailers
注意: HTTP 的GET請(qǐng)求,是沒(méi)有請(qǐng)求體的,這也就是為什么有些公司統(tǒng)一封裝請(qǐng)求為POST,而不是GET的原因了
因?yàn)镻OST是有請(qǐng)求體的,可以帶大量的數(shù)據(jù),GET因?yàn)闆](méi)有請(qǐng)求體,攜帶參數(shù)只能放在URL中,能帶的數(shù)據(jù)量是比較少的。
GET 訪求方法最常用,也是最簡(jiǎn)單的一種,像其語(yǔ)義一樣,GET 就是獲取文件的意思
所以GET請(qǐng)求就是獲取服務(wù)器上的某個(gè)資源 ,使用也很簡(jiǎn)單,我們記住下面兩點(diǎn)就行了
服務(wù)器收到請(qǐng)求就可以解析出來(lái)url后面帶的參數(shù)了,name=tom , age=23
下面我們重點(diǎn)看一下POST請(qǐng)求
POST 是提交的意思,如果我們需要向服務(wù)器提交一些數(shù)據(jù),就可以使用POST方法
雖然POST是提交的意思,協(xié)議規(guī)定的也是用POST提交數(shù)據(jù),但是現(xiàn)在很多公司并沒(méi)有這樣搞
查詢也會(huì)用POST,其實(shí)它只是個(gè)單詞,服務(wù)端收到 請(qǐng)求后,是查詢資源,還是刪除資源,還是提交
都可以的,只是看你們公司前后端怎么規(guī)定即可。
下面我們看看POST有哪幾種提交數(shù)據(jù)的方式
這也是POST默認(rèn)的一種方式 ,對(duì)應(yīng)的請(qǐng)求頭中的 Content-Type 為 application/x-www-form-urlencoded
我們從瀏覽器中抓取www.helloworld.net 上的幾個(gè)請(qǐng)求方式,為例,如下
## 請(qǐng)求頭
POST /v1/special/getSpecialCateList HTTP/2
Host: tiger-api.helloworld.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Authorization:
token:
ts: 1668407094
sign: d41d8cd98f00b204e9800998ecf8427e
deviceType: pc
Origin: https://www.helloworld.net
Connection: keep-alive
Referer: https://www.helloworld.net/
Cookie: Hm_lvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379; Hm_lpvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406398
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Content-Length: 0
## 請(qǐng)求體
action=10&pageNum=1&pageSize=10&uuid=15139897
此種方式,一般是提交key, value 的值。
我之前把這種當(dāng)作了上面的那種,后來(lái)寫文件上傳的時(shí)候,查了一下,原來(lái) 不是
這種提交方法一般是上傳文件用的多。通常是用在客戶端向服務(wù)端傳送大文件數(shù)據(jù),如:圖片或者文件。
首先來(lái)解釋下什么它的編碼方式,首先會(huì)生成一個(gè)很長(zhǎng)的 boundary 字符串分界線,表明下面的都是表單內(nèi)容,然后緊接著跟的是表單中的第一個(gè)鍵值對(duì)中的名稱,而后一個(gè)換行,跟著值。然后再生成一個(gè)boundary 字符串分界線,用于分割不同的鍵值。之后就重復(fù)以上操作,詳細(xì)的流程請(qǐng)看下方的例子。
同樣我們以 www.helloworld.net 舉例,我們從里面找個(gè)接口,抓取一下,看看
# 請(qǐng)求頭
POST http://www.helloworld.net/xyz HTTP/1.1
Host: www.helloworld.net
User-Agent: python-requests/2.24.0
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: multipart/form-data; boundary=e42346452as650adf2345fadade
Content-Length: 222
Connection: keep-alive
# 請(qǐng)求體
--e42346452as650adf2345fadade
Content-Disposition: form-data; name="field0"
value1
--e42346452as650adf2345fadade
Content-Disposition: form-data; name="field1"
value2
--e42346452as650adf2345fadade--
Content-Disposition: form-data; name="field2"; filename="filename"
Content-Type: text/plain
--e42346452as650adf2345fadade--
從上面我們可以知道,在請(qǐng)求頭中的 Content-Type中,有一個(gè) boundary=e42346452as650adf2345fadade
這個(gè)boundary后面的字符串都是隨機(jī)生成的。用于請(qǐng)求體中數(shù)據(jù)的分段的。
其實(shí)就是個(gè)分隔符的作用。
這種就是我們現(xiàn)在用的最多的了,而且也非常方便
在請(qǐng)求頭中設(shè)置 content-type=application/json,就表明請(qǐng)求體中的內(nèi)容格式為json格式
同樣的,服務(wù)端在響應(yīng)的時(shí)候,順應(yīng)頭中也會(huì)添加一個(gè) content-type=application/json
同樣的也是告訴客戶端,我響應(yīng)給你的響應(yīng)體中的內(nèi)容,格式同樣為 json 格式
同的樣我們也參照 www.helloworld.net 中的一個(gè)請(qǐng)求,如下
## 請(qǐng)求頭
POST /v1/special/getSpecialList HTTP/2
Host: tiger-api.helloworld.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/json
Authorization:
token:
ts: 1668408188
sign: 08fab32346193fa92037b5ca5f9ed592
deviceType: pc
Content-Length: 30
Origin: https://www.helloworld.net
Connection: keep-alive
Referer: https://www.helloworld.net/
Cookie: Hm_lvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668406379,1668408042,1668408051; Hm_lpvt_c7e77fd22dddf4a169b8d6f4807c5a4c=1668408051
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
TE: trailers
## 請(qǐng)求體
action=10&pageNum=1&sortType=0
我們看一下響應(yīng)體:
{
"code": 1,
"data": {
"hasMore": false,
"list": [
{
"uuid": "5441523000",
"title": "區(qū)塊鏈原理和應(yīng)用",
"totalCount": 0,
"chapterCount": 1,
"readCount": 0,
"subscribeCount": 1,
"createTime": "0001-01-01T00:00:00Z",
"status": 0,
"profile": "1037883613",
"nicker": "小天",
"avatar": "https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/d04d513fbea19f6cb7c3b4beee3c7f5e.jfif",
"subscribed": false
},
{
"uuid": "bbatgp",
"title": "C語(yǔ)言編程(初級(jí))",
"totalCount": 0,
"chapterCount": 19,
"readCount": 2938,
"subscribeCount": 1,
"createTime": "0001-01-01T00:00:00Z",
"status": 0,
"profile": "80662724",
"nicker": "Suzhou",
"avatar": "https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/d04d513fbea19f6cb7c3b4beee3c7f5e.jfif",
"subscribed": false
}
]
},
"message": "獲取數(shù)據(jù)成功",
"errMessage": ""
}
這個(gè)一直沒(méi)有遇到過(guò),很少用
其實(shí)就是請(qǐng)求消息中,請(qǐng)求體中的內(nèi)容格式是純文本xml格式
此種我們就不作介紹
有興趣的可以下面自己查資料
綜上所述,HTTP 的POST四種方法以及GET的簡(jiǎn)單介紹,我們總結(jié)如下:
1. `application/x-www-form-urlencoded` , 也是默認(rèn)的方式,主要提交的數(shù)據(jù)是key, value 形式的
2. `multipart/form-data` ,此種方式 是客戶端向服務(wù)端提交大數(shù)據(jù)用的,一般上傳文件等用到。
? 注意這種方式,會(huì)在請(qǐng)求頭中生成一個(gè)boundary字段,其對(duì)應(yīng)的值是一個(gè)隨機(jī)生成的字符串,用于分隔請(qǐng)求體中的數(shù)據(jù)用的
簡(jiǎn)單的介紹了一下HTTP的GET,POST的一些知識(shí),希望對(duì)你們有用。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。