HTTP協(xié)議——Request相速、Response

HTTP協(xié)議

對瀏覽器客戶端 和 服務(wù)器端 之間數(shù)據(jù)傳輸?shù)母袷揭?guī)范碟渺。

基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)

無狀態(tài), 但是可用cookie技術(shù)在請求和響應(yīng)報文中寫入cookie信息來控制客戶端的狀態(tài)。

連接步驟:

域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請求 --> 服務(wù)器返回http響應(yīng)突诬,瀏覽器得到html代碼 --> 瀏覽器解析html代碼苫拍,并請求html代碼中的資源(如js、css旺隙、圖片等) --> 瀏覽器對頁面進(jìn)行渲染呈現(xiàn)給用戶

Reqeust

GET /WebRoot/hello HTTP/1.1                       -- 請求行
Host: localhost:8080                              -- 請求頭(多個key-value對象)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
                                                  -- 一個空行
username=123&password=123456                          --(post)請求正文/實體內(nèi)容

請求行

GET /WebRoot/hello HTTP/1.1

#http協(xié)議版本

http1.0:當(dāng)前瀏覽器客戶端與服務(wù)器端建立連接之后怯疤,只能發(fā)送一次請求,一次請求之后連接關(guān)閉催束。

http1.1:默認(rèn)使用長連接集峦,當(dāng)前瀏覽器客戶端與服務(wù)器端建立連接之后,可以在一次連接中發(fā)送多次請求抠刺。(基本都使用1.1)

#請求資源

URL: 統(tǒng)一資源定位符塔淤。http://localhost:8080/WebRoot/hello。只能定位互聯(lián)網(wǎng)資源速妖。是URI 的子集高蜂。URL=協(xié)議+主機端口+URI

URI: 統(tǒng)一資源標(biāo)記符。/WebRoot/hello罕容。用于標(biāo)記任何資源备恤「迨危可以是本地文件系統(tǒng)、局域網(wǎng)的資源露泊、 可以是互聯(lián)網(wǎng)資源喉镰。

#請求方式

常見的請求方式: GET 、 POST惭笑、 HEAD侣姆、 TRACE、 PUT沉噩、 CONNECT 捺宗、DELETE

常用的請求方式: GET 和 POST

GET(獲取資源

  1. GET方法用來查詢,不會對瀏覽器上的信息產(chǎn)生影響
  2. 參數(shù)數(shù)據(jù)跟在地址欄(URI)后川蒙。以蚜厉?開頭、多個參數(shù)之間以&分割:GET /WebRoot/testMethod.html?name=123&password=123456 HTTP/1.1
  3. GET提交參數(shù)數(shù)據(jù)有限制畜眨,不超過1KB弯囊。(實際上URL不存在參數(shù)上限的問題,HTTP協(xié)議規(guī)范沒有對URL長度進(jìn)行限制胶果。這個限制是特定的瀏覽器及服務(wù)器對它的限制,IE對URL長度的限制是2083字節(jié))
  4. GET方式采用的是明文傳輸斤斧,不適合提交敏感密碼早抠。
  5. 注意: 瀏覽器直接訪問的請求,默認(rèn)提交方式是GET方式撬讽∪锪火狐瀏覽器以Get方式提交帶參數(shù)的數(shù)據(jù),會重復(fù)提交兩次

POST(傳輸實體主體

  1. 參數(shù)跟在請求的實體內(nèi)容中游昼。沒有甘苍?開頭、多個參數(shù)之間以&分割
  2. POST提交的參數(shù)數(shù)據(jù)沒有限制烘豌。
  3. POST方式放在報文內(nèi)部無法看到载庭,適合提交敏感數(shù)據(jù)。

請求頭

鍵值對廊佩,例:常見的請求頭

Accept: text/html,image/* -- 瀏覽器接受的內(nèi)容類型
Accept-Charset: ISO-8859-1 -- 瀏覽器接受的編碼格式
Accept-Encoding: gzip,compress --瀏覽器接受的數(shù)據(jù)壓縮格式
Accept-Language: en-us,zh- --瀏覽器接受的語言
Host: www.it315.org:80 --(必輸)當(dāng)前請求域名(主機:端口)
Content-Type: application/x-www-form-urlencoded --提交的數(shù)據(jù)類型
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --瀏覽器最后的緩存時間
Referer: http://www.it315.org/index.jsp -- 當(dāng)前請求來自于哪里(可用來判斷非法鏈接)
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --瀏覽器版本類型
Cookie:name=123 -- 瀏覽器保存的cookie信息
Connection: close/Keep-Alive -- 瀏覽器跟服務(wù)器連接狀態(tài)囚聚。close:連接關(guān)閉 keep-alive:保持連接
Date: Tue, 11 Jul 2000 18:23:51 GMT -- 請求發(fā)出的時間

Content-Type 常見的媒體格式類型如下:

? text/html: HTML格式
? text/plain :純文本格式
? text/xml : XML格式
? text/x-markdown:markdown格式
? image/gif :gif圖片格式
? image/jpeg :jpg圖片格式
? image/png:png圖片格式

application/xhtml+xml :XHTML格式
application/xml : XML數(shù)據(jù)格式
application/atom+xml :Atom XML聚合格式
application/json : JSON數(shù)據(jù)格式
application/pdf :pdf格式
application/msword : Word文檔格式
application/octet-stream : 二進(jìn)制流數(shù)據(jù)(如常見的文件下載)
application/x-www-form-urlencoded : <form encType="">中默認(rèn)的encType(表單默認(rèn)的提交數(shù)據(jù)的格式)

form表單數(shù)據(jù)被編碼以鍵值對形式?key1=value1&key2=value2的方式發(fā)送到服務(wù)器

空行

請求正文/實體內(nèi)容

請求頭和請求正文之間是一個空行标锄,它表示請求頭已經(jīng)結(jié)束顽铸,接下來的是請求正文。

只有POST提交的參數(shù)會放到實體內(nèi)容中,如username=123&password=123456

HttpServletRequest

tomcat服務(wù)器把請求信息封裝到HttpServletRequest對象料皇,把響應(yīng)信息封裝到HttpServletResponse對象谓松。然后調(diào)用servlet的方法星压,傳入request和response對象

HttpServletRequest對象用于獲取請求數(shù)據(jù),核心的API:

請求行

request.getMethod(); 獲取請求方式

request.getRequetURI(); / request.getRequetURL(); 獲取請求資源

request.getProtocol(); 獲取請求http協(xié)議版本

request.getQueryString(); (獲取GET方式傳遞的參數(shù))

請求頭

request.getHeaderNames(); 獲取所有的請求頭名稱

request.getHeader("名稱"); 根據(jù)請求頭獲取請求值

實體內(nèi)容

request.getInputStream(); 獲取實體內(nèi)容數(shù)據(jù)(獲取POST方式傳遞的參數(shù))

GET鬼譬、POST請求參數(shù) 統(tǒng)一通用方便的獲取方法

request.getParameterNames(); 獲取所有參數(shù)名稱列表(參數(shù)名為 html表單中數(shù)據(jù)標(biāo)簽的name屬性值)

request.getParameter("參數(shù)名"); 根據(jù)參數(shù)名獲取參數(shù)值(只能獲取一個值的參數(shù))

request.getParameterValue("參數(shù)名“); 根據(jù)參數(shù)名獲取參數(shù)值(可以獲取多個值的參數(shù))

編碼問題

修改GET方式參數(shù)編碼:

手動解碼:String name = new String(request.getParameter("參數(shù)名").getBytes("iso-8859-1"),"utf-8");

修改POST方式參數(shù)編碼:

設(shè)置參數(shù)查詢碼表:request.setCharacterEncoding("utf-8"); 放在查詢參數(shù)之前娜膘,只對實體內(nèi)容起作用

改服務(wù)器配置文件:找到并在%tomcat%/conf/server.xml文件Connector標(biāo)簽中加入 URIEncoding="utf-8"

請求案例:獲取瀏覽器的類型(user-agent), 防止非法鏈接(referer)

Response

HTTP/1.1  200  OK                        --響應(yīng)行
Server: Apache-Coyote/1.1                --響應(yīng)頭(key-vaule)
Content-Length: 24
Date: Fri, 30 Jan 2015 01:54:57 GMT
                                         --一個空行
this is hello servlet!!!                 --響應(yīng)正文/實體內(nèi)容

響應(yīng)行

HTTP/1.1 200 OK

#狀態(tài)碼: 服務(wù)器處理請求的結(jié)果(狀態(tài))

常見的狀態(tài):

200: 表示請求處理完成并完美返回

302: 表示請求需要進(jìn)一步細(xì)化拧簸。

404: 表示客戶訪問的資源找不到劲绪。

500: 表示服務(wù)器的資源發(fā)送錯誤。(服務(wù)器內(nèi)部錯誤)

#狀態(tài)描述

響應(yīng)頭

鍵值對盆赤,例:常見的響應(yīng)頭

Location: 重定向地址 --表示重定向的地址贾富,該頭和302的狀態(tài)碼一起使用。
Server:apache tomcat --表示服務(wù)器的軟件信息, 它和請求報頭域User-Agent是相對應(yīng)的
Content-Encoding: gzip --表示服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)壓縮類型
Content-Length: 80 --表示服務(wù)器發(fā)送給瀏覽器的實體正文長度
Content-Language: zh-cn --表示服務(wù)器支持的語言
Content-Type: text/html; charset=GB2312 --表示服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)類型內(nèi)容編碼
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --表示服務(wù)器資源的最后修改時間
Refresh: 秒數(shù);url=地址 --表示定時刷新到指定頁面
Content-Disposition: attachment; filename=aaa.zip --表示告訴瀏覽器以下載方式打開資源(下載文件時用到)
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search --表示服務(wù)器發(fā)送給瀏覽器的cookie信息(會話管理用到)
Expires: -1 --響應(yīng)過期時間牺六,-1表示通知瀏覽器不進(jìn)行緩存
Cache-Control: no-cache --同上
Pragma: no-cache --同上
Connection: close/Keep-Alive --表示服務(wù)器和瀏覽器的連接狀態(tài)颤枪。close:關(guān)閉連接 keep-alive:保存連接

響應(yīng)行

響應(yīng)正文/實體內(nèi)容

響應(yīng)正文就是服務(wù)器返回給瀏覽器的資源的內(nèi)容:html, css, js,甚至圖片

由響應(yīng)頭的Content-···等屬性告知瀏覽器 響應(yīng)正文的長度、編碼淑际、媒體類型等(MIME Type是經(jīng)過 ietf 組織協(xié)商畏纲,以 RFC 的形式作為建議標(biāo)準(zhǔn)發(fā)布在網(wǎng)上的)

由response對象PrintWriter寫入數(shù)據(jù)內(nèi)容

HttpServletResponse

tomcat服務(wù)器把請求信息封裝到HttpServletRequest對象,把響應(yīng)信息封裝到HttpServletResponse對象春缕。然后調(diào)用servlet的方法盗胀,傳入request和response對象
HttpServletResponse對象用于修改響應(yīng)信息,核心的API:

響應(yīng)行

response.setStatus(); 設(shè)置狀態(tài)碼

響應(yīng)頭

response.setHeader("name","value"); 設(shè)置響應(yīng)頭

response.sendRedirect(url); 重定向

response.setContentType("text/html;charset=utf-8"); 發(fā)送給瀏覽器的數(shù)據(jù)類型 及內(nèi)容編碼

實體內(nèi)容:(瀏覽器直接能夠看到)

response.getWriter().writer(); 發(fā)送字符實體內(nèi)容

response.getOutputStream().writer() 發(fā)送字節(jié)實體內(nèi)容

tomcat服務(wù)器把response對象的內(nèi)容轉(zhuǎn)換成響應(yīng)格式內(nèi)容锄贼,再發(fā)送給瀏覽器解析票灰。

編碼問題

response.setCharacterEncoding("utf-8"); 放在響應(yīng)實體內(nèi)容代碼之前,對getOutputStream().writer()字節(jié)流不起作用

響應(yīng)案例:請求重定向(Location)宅荤,定時刷新(refresh)屑迂,content-Type數(shù)據(jù)類型(在tomcat服務(wù)器web.xml中用mime-type標(biāo)簽規(guī)定了數(shù)據(jù)類型,例如:text/html發(fā)送HTML文本冯键;image/jpg發(fā)送圖片)


HTTPS協(xié)議 是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸惹盼、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惫确,一起剝皮案震驚了整個濱河市手报,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌改化,老刑警劉巖昧诱,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異所袁,居然都是意外死亡盏档,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門燥爷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜈亩,“玉大人懦窘,你說我怎么就攤上這事≈膳洌” “怎么了畅涂?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長道川。 經(jīng)常有香客問我午衰,道長,這世上最難降的妖魔是什么冒萄? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任臊岸,我火速辦了婚禮,結(jié)果婚禮上尊流,老公的妹妹穿的比我還像新娘帅戒。我一直安慰自己,他們只是感情好崖技,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布逻住。 她就那樣靜靜地躺著,像睡著了一般迎献。 火紅的嫁衣襯著肌膚如雪瞎访。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天吁恍,我揣著相機與錄音扒秸,去河邊找鬼。 笑死践盼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宾巍。 我是一名探鬼主播咕幻,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼顶霞!你這毒婦竟也來了肄程?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤选浑,失蹤者是張志新(化名)和其女友劉穎蓝厌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體古徒,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡拓提,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了隧膘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片代态。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡寺惫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹦疑,到底是詐尸還是另有隱情西雀,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布歉摧,位于F島的核電站艇肴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叁温。R本人自食惡果不足惜再悼,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望券盅。 院中可真熱鬧帮哈,春花似錦、人聲如沸锰镀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泳炉。三九已至憾筏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間花鹅,已是汗流浹背氧腰。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刨肃,地道東北人古拴。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像真友,于是被迫代替她去往敵國和親黄痪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354