OkHttp3原始碼(三) Header

2021-08-17 17:14:43 字數 4011 閱讀 1016

由於header類是之前已經分析好的,所以這裡直接拿過來就可以了。

之所以之前沒有發布這篇部落格是因為在學習header類之前,首先要明白http首部資訊的相關欄位及內容,關於這個如果還不太了解請參看http首部的字段及相應的取值內容

header類屬性:

//通過字串資料的方式維護資料,用於實現獲取資料的功能。

private

final string namesandvalues;

header類只有乙個屬性,這個屬性的含義已表明。

header類的構造方法

headers(builder builder) 

private

headers(string namesandvalues)

通過header類的構造方法我們知道,對於使用者來說它是禁止new的。所以例項化該類的方法另有其它。

例項化header類的方法

//例項化header並檢查傳遞的資料是否合法,然後設定字串陣列。

public

static headers of(string... namesandvalues)

namesandvalues = namesandvalues.clone();

for (int i = 0; i < namesandvalues.length; i++)

for (int i = 0; i < namesandvalues.length; i += 2)

}return

new headers(namesandvalues);

}//例項化header類並檢查資料的合法性,然後通過map集合設定字串陣列,

public

static headers of(mapheaders)

string name = header.getkey().trim();

string value = header.getvalue().trim();

if (name.length() == 0 || name.indexof('\0') != -1 || value.indexof('\0') != -1)

namesandvalues[i] = name;

namesandvalues[i + 1] = value;

i += 2;

}return

new headers(namesandvalues);

}//通過builder例項化headers類,並將自身的list集合傳遞過去。

public headers build()

我們可以看到上面三個方法可以例項化header類,前兩個是header類的兩個靜態方法,最後乙個是header類的內部類builder的成員方法。

headler類中根據首部欄位名獲取值的方法

//獲得字串陣列中名稱為name的頭資訊,如果名稱為name的頭資訊由多個,則返回最先加入的乙個。

private

static string get(string namesandvalues, string name)

}return

null;

}//獲得名稱為name的最先新增的頭資訊

public string get(string name)

//根據名稱獲得與日期有關的頭資訊,並將日期格式化成http資料格式

public date getdate(string name)

//返回所有名稱為name的頭資訊

public listvalues(string name)

}return result != null

? collections.unmodifiablelist(result)

: collections.emptylist();

}

header類中根據腳標獲得首部欄位名稱或首部字段值的方法

//根據腳標獲得頭資訊的名稱

public string name(int index)

//根據腳標獲得頭資訊

public string value(int index)

header類中其它方法

//返回所有頭資訊的名稱

public

set<

string

> names()

return collections.unmodifiableset(result);

}//返回所有頭資訊的長度

public int size()

//將名稱相同的頭資訊放在一起組成list,並和名稱組成map集合

public

map<

string, list

<

string

>> tomultimap()

values.add(value(i));

}return result;

}

headler類中內部類——builder

/**

* 接下來就是builder設計模式

* okhttp用的比較多的設計模式

* 對builder模式不了解的,先去了解下。這裡概括一下builder模式:類的某些字段無法通過自身去賦值,需要委託給其他類去賦值。

*/public

static final class builder

}if (value == null) throw

new nullpointerexception("value == null");

for (int i = 0, length = value.length(); i < length; i++) }}

//增加頭部資訊(可以理解為增加一種特殊的鍵值對,規則是 key:value、"":value、value 這三種方式)

builder addlenient(string line) else

if (line.startswith(":")) else

}//增加頭部資訊(可以理解為增加一種特殊的鍵值對,規則是 key:value 這一種方式)

public builder add(string line)

return add(line.substring(0, index).trim(), line.substring(index + 1));

}//增加頭部資訊名稱和相應的頭部資訊(這個是增加,並不會刪除原有相同名稱的頭部資訊)

public builder add(string name, string value)

//增加頭部資訊的name和相應的頭部資訊。

builder addlenient(string name, string value)

//設定唯一的頭部資訊(新增這個頭部資訊前,先要刪除所有與這個頭部名稱相同的頭部資訊)

public builder set(string name, string value)

//清除所有名稱為name的頭部資訊

public builder removeall(string name)

}return

this;

}//根據名稱獲得最先加入的頭部資訊

public string get(string name)

}return

null;

}//通過builder例項化headers類,並將自身的list集合傳遞過去。

public headers build()

}

header類主要是通過list集合的方式實現動態新增和刪除首部字段資訊,通過字串陣列的方式實現獲取首部字段資訊。

OkHttp3原始碼解析

compile com.squareup.okhttp3 okhttp 3.6.0 最新版本 okhttp的最底層是使用socket,而不是urlconnection,它通過platform的class.forname 反射獲得當前runtime使用的socket庫。okhttp3使用場景特點 資料...

OkHttp3原始碼(二) Request

request 是對http請求報文概念的具體實現 請求報文的結構圖 根據結構圖去閱讀原始碼能很好的理解某些屬性的真實意義。我們看一下原始碼。public final class request 返回設定的url 返回設定的方法 get或post public string method 返回所有的...

Okhttp3原始碼完全解析

上文已經說了,okhttp和retrofit是相輔相成的,retrofit是對okhttp的上層封裝,okhttp是http的底層實現。那麼,今天就來解析一下okhttp的原始碼。okhttp的使用如下,我們能夠看到,先是new了乙個okhttpclient,然後這個okhttpclient又new...