WebCore內(nèi)核本身并不實(shí)現(xiàn)http協(xié)議,它通過調(diào)用不同平臺(tái)的http庫,比如Qt的QnetWorkRequest,gtk的soup,或者curl等,來實(shí)現(xiàn)http協(xié)議的功能。這里將以curl為例,來理解webcore中的請(qǐng)求信息維護(hù)。
http協(xié)議的細(xì)節(jié),如果希望深入了解的話,可以參考rfc2616,rfc2617。簡(jiǎn)單介紹下它的原理,http協(xié)議遵循的是一個(gè)請(qǐng)求à響應(yīng)的機(jī)制。也就是說,一個(gè)url,對(duì)應(yīng)一個(gè)請(qǐng)求à響應(yīng)鏈。而在網(wǎng)頁中,任何資源對(duì)應(yīng)的都是一個(gè)url。如果客戶端想從服務(wù)器端申請(qǐng)一個(gè)資源,需要發(fā)起一個(gè)請(qǐng)求,http的請(qǐng)求格式是純文本格式,如下是一個(gè)簡(jiǎn)單的例子:
Get /index.htmlHTTP/1.1
Accept: text/html,*/*
User-Agent:mozilla/4.0
Host:www.csdn.net
Referer:www.hao123.com
Connection:Keep-Alive
以上是獲取 http://www.csdn.net /index.html的請(qǐng)求。Accept,User-Agent,Host,Referer,Connection都是請(qǐng)求頭部的字段。
Csdn在收到這樣一個(gè)請(qǐng)求以后,如果它的服務(wù)器上確實(shí)存在test.png這個(gè)資源,則返回http響應(yīng)如下
HTTP/1.1 200 OK
Content-Length: 862
Date: Tue, 12 Oct 2010 06:21:46 GMT
Content-Type: text/html
ETag: "b59305a7-35e-484b91e27e9ec"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<title>csdn.net,中國(guó)領(lǐng)先的it技術(shù)社區(qū)</title>
</head>
<body>
…………………………….
</body>
</html>
這樣,一個(gè)http請(qǐng)求就完成了,流程非常簡(jiǎn)單明了,所以在互聯(lián)網(wǎng)上使用特別廣泛。由于只是一個(gè)簡(jiǎn)單的請(qǐng)求à響應(yīng)機(jī)制,所以http是沒有狀態(tài)這一個(gè)說法的(這同大部分協(xié)議基于狀態(tài)機(jī)的機(jī)制是不同的),當(dāng)然,為了在某些情況下,維護(hù)一個(gè)狀態(tài),http加入了cookie的管理機(jī)制,利用cookie來實(shí)現(xiàn)了一些狀態(tài)的管理。另外,為了節(jié)約網(wǎng)絡(luò)流量,提高性能,http協(xié)議中定義了cache的機(jī)制。
http的協(xié)議細(xì)節(jié)實(shí)現(xiàn)并不需要WebCore來關(guān)注,WebCore要關(guān)注的是,如何設(shè)置請(qǐng)求的相關(guān)頭部信息,如何獲取服務(wù)器返回回來的響應(yīng)體部數(shù)據(jù)。
WebKit中同http打交道的類主要是ResourceRequest,ResourceResonse,ResourceHandle*,ResourceHandleManager等,這里先介紹同請(qǐng)求信息維護(hù)相關(guān)的ResourceRequest.
ResourceRequest類的作用比較好理解,基本上就是維護(hù)http請(qǐng)求相關(guān)的信息(app或者內(nèi)核都有可能設(shè)置這些信息),然后當(dāng)WebCore發(fā)起http請(qǐng)求的時(shí)候,可以獲取這些信息,調(diào)用curl的接口設(shè)置對(duì)應(yīng)的http請(qǐng)求字段。在這些信息中,最常用到的是url。
ResourceRequest類繼承于ResourceRequestBase類,絕大部分功能在ResourceRequestBase類中實(shí)現(xiàn)。
一)ResourceRequest構(gòu)造:構(gòu)造一個(gè)ResourceRequest對(duì)象只需要url參數(shù)就夠了,這是比較簡(jiǎn)單的一個(gè)類,沒有維護(hù)其它類的對(duì)象或者句柄。
ResourceRequest(const String& url);
ResourceRequest(const KURL& url);
二)ResourceRequest對(duì)象的創(chuàng)建與維護(hù)
1.當(dāng)用戶輸入網(wǎng)址,開始一個(gè)網(wǎng)頁的請(qǐng)求的時(shí)候,會(huì)調(diào)用QwebFrame::load函數(shù),在該函數(shù)中,會(huì)構(gòu)造出ResourceRequest對(duì)象,并將這個(gè)對(duì)象作為一個(gè)參數(shù),調(diào)用FrameLoader類的load函數(shù),DocumentLoader類中會(huì)維護(hù)這個(gè)ResourceRequest,在調(diào)用MainResourceLoader的load接口的時(shí)候,也會(huì)把ResourceRequest對(duì)象傳遞過去,在MainResourceLoader中維護(hù)相應(yīng)的信息。當(dāng)MainResourceLoader類loadNow接口的時(shí)候,又會(huì)在創(chuàng)建的ResourceHandle的內(nèi)部數(shù)據(jù)結(jié)構(gòu)成員(ResourceHandleInternal)d中維護(hù)ResourceRequest對(duì)象。
2.
3.
4.
5.FrameLoader
6.DocumentLoader
對(duì)應(yīng)的請(qǐng)求是不停地在變化的(比如發(fā)生重定向),所以結(jié)構(gòu)中維護(hù)了多個(gè)ResourceRequest對(duì)象,這些對(duì)象可能不一樣
三)其它
在這個(gè)類中,還可以通過cachePolicy,setCachePolicy,allowCookies,setAllowCookies在WebKit和http之間建立起控制的通道
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
