由於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...