標籤:能力 type rssi 最新 groups tle 允許 min 響應
HAR(HTTP Archive),是一個用來儲存HTTP請求/響應資訊的通用檔案格式,基於JSON。這個格式的出現可以使HTTP監測工具以一種通用的格式匯出所收集的資料,這些資料可以被其他支援HAR的HTTP分析工具(包括Firebug,httpwatch,Fiddler等)所使用,來分析網站的效能瓶頸。目前HAR規範最新版本為HAR 1.2。HAR檔案必須是UTF-8編碼,有無BOM無所謂。
查看har檔案資料的URL:http://www.softwareishard.com/har/viewer/
HAR資料結構:
一個HAR檔案就是一個JSON對象,如下:
{
"log": {
"version" : "1.2",
"creator" : {},
"browser" : {},
"pages": [],
"entries": [],
"comment": ""
}
}
version [string] – 版本,預設為1.1。
creator [object] – 建立HAR檔案的程式名稱和版本資訊。
browser [object, 可選] – 瀏覽器的名稱和版本資訊。
pages [array, 可選] – 頁面列表,如果應用不支援按照page分組,可以省去此欄位。
entries [array] – 所有HTTP請求的列表。
comment [string, 可選](new in 1.2) – 注釋。
註:每個頁面對應一個 對象,每個HTTP請求對應一個對象。如果HTTP的監測分析工具不能把請求按照page分組,那麼為空白。
<creator> & <browser>
這兩個對象的結構是一樣的
"creator": {
"name": "Firebug",
"version": "1.6",
"comment": "",
}
"browser": {
"name": "Firefox",
"version": "3.6",
"comment": ""
}
name [string] – HAR產生工具或者瀏覽器的名稱。
version [string] – HAR產生工具或者瀏覽器的版本。
comment [string, 可選](new in 1.2) – 注釋。
<pages>
這個對象儲存了頁面列表,格式如下:
"pages": [
{
"startedDateTime": "2009-04-16T12:07:25.123+01:00",
"id": "page_0",
"title": "Test Page",
"pageTimings": {...},
"comment": ""
}
]
startedDateTime [string] – 頁面開始載入的時間(格式ISO 8601 – YYYY-MM-DDThh:mm:ss.sTZD, 例如2009-07-24T19:20:30.45+01:00)。
id [string] – page的唯一標示,entry會用到這個id來和page關聯在一起。
title [string] – 頁面標題。
pageTimings[object] – 頁面載入過程中詳細的時間資訊。
comment [string, 可選](new in 1.2) – 注釋。
<pageTimings>
這個對象描述了在頁面載入過程中各個事件發生的時間點。所有的時間都是以毫秒計算的。如果有的時間無法計算出來,那麼相應欄位置為-1。
"pageTimings": [
{
"onContentLoad": 1720,
"onLoad": 2500,
"comment": ""
}
]
onContentLoad [number, 可選] – 頁面內容載入時間,相對於頁面開始載入時間的毫秒數(page.startedDateTime)。如果時間不適用於當前的請求,那麼置為-1。
onLoad [number,可選] – 頁面載入時間(即onLoad事件觸發的時間)。相對於頁面開始載入時間的毫秒數(page.startedDateTime)。如果時間不適用於當前的請求,那麼置為-1。
comment [string, 可選](new in 1.2) – 注釋。
由於不同瀏覽器實現不一樣,onContentLoad屬性可能代表DOMContentLoad事件觸發,也可能代表document.readyState等於interactive。
<entries>
這個對象包含了一個數組,數組中每個元素的內容就是一個HTTP請求的相應資訊。用startedDateTime來排序的話可以加快資料匯出的速度。HAR分析工具要確保此數組是按照startedDateTime排序的。
"entries": [
{
"pageref": "page_0",
"startedDateTime": "2009-04-16T12:07:23.596Z",
"time": 50,
"request": {...},
"response": {...},
"cache": {...},
"timings": {},
"serverIPAddress": "10.0.0.1",
"connection": "52492",
"comment": ""
}
]
pageref [string, unique, 可選] – 頁面id,如果不支援按照page分組,那麼欄位為空白。
startedDateTime [string] – 請求開始時間 (格式ISO 8601 – YYYY-MM-DDThh:mm:ss.sTZD)。
time [number] – 請求消耗的時間,以毫秒為單位。這個值是timings對象中所有可用(值不為-1) timing的和。
request [object] – 請求的詳細資料。
response [object] – 響應的詳細資料。
cache [object] – 緩衝使用方式的資訊。
timings [object] – 請求/響應過程(round trip)的詳細時間資訊。
serverIPAddress [string, 可選](new in 1.2) – 伺服器IP地址。
connection [string, 可選](new in 1.2)– TCP/IP串連的唯一標示。 如果程式不支援,直接忽略此欄位。
comment [string, optional](new in 1.2) – 注釋。
<request>
這個對象包含了請求的詳細資料
"request": {
"method": "GET",
"url": "http://www.example.com/path/?param=value",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [],
"queryString" : [],
"postData" : {},
"headersSize" : 150,
"bodySize" : 0,
"comment" : "",
}
method [string] – 要求方法(GET,POST,…)。
url [string] – 請求的絕對URL(fragments are not included)。
httpVersion [string] – 請求HTTP版本。
cookies [array] – cookie列表。
headers [array] – header列表。
queryString [object] – 查詢字串資訊。
postData [object, 可選] – Post資料資訊。
headersSize [number] – HTTP要求標頭的位元組數。如果不可用,設定為-1。
bodySize [number] – 請求body位元組數(POST資料)。如果不可用,設定為-1。
comment [string, 可選](new in 1.2)– 注釋。
<response>
這個對象包含響應的詳細資料。
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [],
"content": {},
"redirectURL": ",
"headersSize" : 160,
"bodySize" : 850,
"comment" : ""
}
status [number] – 響應狀態。
statusText [string] – 響應狀態原因。
httpVersion [string] – HTTP版本。
cookies [array] – cookie列表。
headers [array] – header列表。
content [object] – 響應內容的詳細資料。
redirectURL [string] – Location回應標頭中的重新導向URL。
headersSize [number]* – HTTP要求標頭的位元組數。如果不可用,設定為-1。
bodySize [number] – 接收的body位元組數。如果響應來自緩衝(304),那麼設定為0。如果不可用,設定為-1。
comment [string, optional](new in 1.2) – 注釋。
註:headersSize – 回應標頭大小隻對從伺服器接收到的header進行計算。被瀏覽器加上的header不計算在內,但是會加在header列表中。
<cookies>
這個對象包含了所有的cookie(在和中被使用)。
"cookies": [
{
"name": "TestCookie",
"value": "Cookie Value",
"path": "/",
"domain": "www.janodvarko.cz",
"expires": "2009-07-24T19:20:30.123+02:00",
"httpOnly": false,
"secure": false,
"comment": "",
}
]
name [string] – cookie名稱。
value [string] – cookie值。
path [string, 可選] – cookie Path。
domain [string, 可選] – cookie網域名稱。
expires [string, 可選] – cookie到期時間。(格式ISO 8601 – YYYY-MM-DDThh:mm:ss.sTZD, 例如2009-07-24T19:20:30.123+02:00)。
httpOnly [boolean, 可選] – 如果cookie只是在HTTP下有效,此值設定為true,否則設定為false。
secure [boolean, 可選](new in 1.2) – 如果cookie通過ssl傳送,此值設定為true,否則設定為false。
comment [string, 可選](new in 1.2) – 注釋。
<headers>
這個對象包含了所有的header(可以在lt;request>and<response>中使用)
"headers": [
{
"name": "Accept-Encoding",
"value": "gzip,deflate",
"comment": ""
},
{
"name": "Accept-Language",
"value": "en-us,en;q=0.5",
"comment": ""
}
]
<queryString>
這個對象包含了查詢字串中所有的paramter-value對(嵌在對象中)。
"queryString": [
{
"name": "param1",
"value": "value1",
"comment": ""
},
{
"name": "param1",
"value": "value1",
"comment": ""
}
]
<postData>
這個對象描述了POST的資料(嵌在對象中)
"postData": {
"mimeType": "multipart/form-data",
"params": [],
"text" : "plain posted data",
"comment": ""
}
mimeType [string] – POST資料的MIME類型。
params [array] – POST參數列表 (in case of URL encoded parameters)。
text [string] – POST資料的純文字形式(Plain text posted data)。
comment [string, optional](new in 1.2) – 注釋。
注意:text和params欄位是互斥的。
<params>
POST請求參數列表(嵌在 對象中)
"params": [
{
"name": "paramName",
"value": "paramValue",
"fileName": "example.pdf",
"contentType": "application/pdf",
"comment": ""
}
]
name [string] – POST參數名。
value [string, 可選] – POST參數的值,或者POST檔案的內容。
fileName [string, 可選] – POST檔案的檔案名稱。
contentType [string, 可選] – POST檔案的類型。
comment [string, 可選](new in 1.2) – 注釋。
<content>
這個對象描述了響應內容的詳細情況(嵌在 對象中)
"content": {
"size": 33,
"compression": 0,
"mimeType": "text/html; charset="utf-8",
"text": "n",
"comment": ""
}
size [number] – 返回內容的位元組數。如果內容沒有被壓縮,應該和response.bodySize相等;如果被壓縮,那麼會大於response.bodySize。
compression [number, 可選] – 節省的位元組數。如果無法提供此資訊,則忽略此欄位。
mimeType [string] – 響應文本的MIME類型 (Content-Type回應標頭的值)。MIMIE類型的字元集也包含在內。
text [string, 可選] – 從伺服器返回的響應body或者從瀏覽器緩衝載入的內容。這個欄位只能用文本型的內容來填充。欄位內容可以是HTTP decoded(decompressed & unchunked)的文本,或者是經編碼(例如,base64)過的響應內容。如果資訊不可用,忽略此欄位。
encoding [string, 可選](new in 1.2) – 響應內容的編碼格式,例如”base64″。如果text欄位的內容是經過了HTTP解碼(decompressed & unchunked)的,那麼忽略此欄位。
comment [string, optional](new in 1.2) – 注釋。
在設定text欄位之前,HTTP響應內容已經完成瞭解碼(decompressed & unchunked),然後把原始字元編碼轉換成UTF-8。欄位內容同樣可以使用base64進行編碼,但是HAR工具必須有解碼base64的能力。對欄位編碼還可以把二進位內容包含進HAR檔案中。
這有另一個例子,原始響應內容是:
"content": {
"size": 33,
"compression": 0,
"mimeType": "text/html; charset="utf-8",
"text": "PGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5Lz48L2h0bWw+XG4=",
"encoding": "base64",
"comment": ""
}
<cache>
這個對象包含了命中的瀏覽器緩衝資訊
"cache": {
"beforeRequest": {},
"afterRequest": {},
"comment": ""
}
beforeRequest [object, 可選] – 在請求之前緩衝的狀態。如果資訊不可用,可以忽略此欄位。
afterRequest [object, 可選] – 在請求之後緩衝的狀態。 如果資訊不可用,可以忽略此欄位。
comment [string, 可選](new in 1.2) – 注釋。
如果緩衝資訊為空白,那麼對象如下(或者也可以直接刪掉cache這個欄位):
"cache": {}
如果在請求之前,緩衝資訊不可用,並且在請求之後也沒有對內容進行緩衝,那麼對象如下:
"cache": {
"afterRequest": null
}
如果在請求前後都沒有緩衝存在,那麼對象如下:
"cache": {
"beforeRequest": null,
"afterRequest": null
}
以下對象表示請求之前沒有緩衝,但是在請求後,下載的內容被存在了本機快取中。
"cache": {
"beforeRequest": null,
"afterRequest": {
"expires": "2009-04-16T15:50:36",
"lastAccess": "2009-16-02T15:50:34",
"eTag": ",
"hitCount": 0,
"comment": ""
}
}
beforeRequest和afterRequest對象使用以下相同的結構:
"beforeRequest": {
"expires": "2009-04-16T15:50:36",
"lastAccess": "2009-16-02T15:50:34",
"eTag": ",
"hitCount": 0,
"comment": "“”
}
expires [string, 可選] – 緩衝到期時間。
lastAccess [string] – 緩衝最後被訪問的時間。
eTag [string] – Etag
hitCount [number] – 緩衝被訪問的次數。
comment [string, 可選](new in 1.2) – 注釋
<timings>
這個對象描述了請求/響應過程的各個階段。時間都是以毫秒為單位。
"timings": {
"blocked": 0,
"dns": -1,
"connect": 15,
"send": 20,
"wait": 38,
"receive": 12,
"ssl": -1,
"comment": ""
}
blocked [number, 可選] – 建立網路連接時在隊列裡邊等待的時間。如果時間對於當前請求不可用,置為-1。
dns [number, 可選] – DNS查詢時間。如果時間對於當前請求不可用,置為-1。
connect [number, 可選] – 建立TCP串連所需的時間。如果時間對於當前請求不可用,置為-1。
send [number] – 發送HTTP請求到伺服器所需的時間。
wait [number] – 等待伺服器返迴響應的時間。
receive [number] – 接收伺服器響應(或者緩衝)所需時間。
ssl [number, 可選](new in 1.2) – SSL/TLS驗證花費時間。如果這個欄位被定義了,那麼這個時間也會被包含進connect欄位中(為了向後相容HAR1.1)。如果時間對於當前請求不可用,置為-1。
comment [string, 可選](new in 1.2) – 注釋。
send,wait,receive時間是必須提供的,並且不能為負數。匯出工具如果不能提供blocked,dns,connect和ssl等時間,那麼這些時間可以被忽略。如果工具可以提供這些時間,但是不適用的話,可以把這些值設定為-1。 例如,當請求使用了一個存在的串連,connect會被置為-1。
一個請求所花的時間等於這些時間的和,不包括值為-1的。
entry.time == entry.timings.blocked + entry.timings.dns + entry.timings.connect + entry.timings.send + entry.timings.wait + entry.timings.receive
自訂欄位
HAR規範允許自訂欄位,但是要遵循如下規則:
自訂欄位(field)和元素(element)必須以底線開頭(規範中的欄位必須不能以底線開頭)
HAR工具必須忽略所有自訂欄位和元素,如果這個HAR檔案不是當前HAR工具產生的。
當HAR工具不知道如何解析非自訂欄位的時候,忽略它們。
當檔案包含了已經被廢棄的非自訂欄位時候,HAR工具可以拒絕解析此檔案。
版本格式
HAR規範的版本號碼有如下規則:
<主要版本號>.<副版本號碼>
主要版本號表示規範的向後相容性,副版本號碼表示增量修改。所以,任何向後相容的修改都會增加副版本號碼。如果一個存在的欄位被廢棄了,那麼主要版本號要增加(例如2.0)。
Examples:
1.2 -> 1.3(向後相容)
1.111 -> 1.112 (向後相容)
1.5 -> 2.0 (2.0不相容1.5)
如果HAR工具只支援HAR1.1,那麼以下的代碼可以被用來檢測不被相容的版本。
if (majorVersion != 1 || minorVersion < 1)
{
throw “Incompatible version”;
}
這個例子中,如果被解析檔案的版本為0.8,0.9,1.0等,那麼工具會拋出異常,但是1.1, 1.2, 1.112等版本可以被解析。2.x版本直接拒絕解析。
原文:http://www.softwareishard.com/blog/har-12-spec/
Google Group: http://groups.google.com/group/http-archive-specification【需FQ】
(完)
作者: JeremyWei | 可以轉載, 但必須以超連結形式標明文章原始出處和作者資訊及著作權聲明
轉載自: http://weizhifeng.net/har-12-spec-chinese-edtion.html
轉:HAR(HTTP Archive)規範