轉載請以鏈接形式標明出處:
本文出自:103style的博客
base on 3.12.0
目錄
- Request 簡介
- Request相關的配置方法
- Header介紹
Request 簡介
Request
即我們構建的每一個HTTP
請求。通過配置請求的 地址、http方法、請求頭 等信息。
使用方法:
Request request = new Request.Builder()
.url("https://publicobject.com/helloworld.txt")//指定請求地址
.delete()//指定請求的方法
.build();
Request
成員變量和構造方法:
public final class Request {
final HttpUrl url;//請求地址
final String method;//請求方法
final Headers headers;//頭信息
final @Nullable RequestBody body;//請求體
//當前請求的標籤
final Map<Class<?>, Object> tags;
// 頭信息的Cache-Control
private volatile @Nullable CacheControl cacheControl;
Request(Builder builder) {
this.url = builder.url;
this.method = builder.method;
this.headers = builder.headers.build();
this.body = builder.body;
this.tags = Util.immutableMap(builder.tags);
}
...
}
Request相關的配置方法
默認的配置,默認爲get
請求.
public Builder() {
this.method = "GET";
this.headers = new Headers.Builder();
}
-
設置請求地址
.url(xxx)
public Builder url(HttpUrl url) { if (url == null) throw new NullPointerException("url == null"); this.url = url; return this; } public Builder url(String url) { if (url == null) throw new NullPointerException("url == null"); // Silently replace web socket URLs with HTTP URLs. if (url.regionMatches(true, 0, "ws:", 0, 3)) { url = "http:" + url.substring(3); } else if (url.regionMatches(true, 0, "wss:", 0, 4)) { url = "https:" + url.substring(4); } return url(HttpUrl.get(url)); } public Builder url(URL url) { if (url == null) throw new NullPointerException("url == null"); return url(HttpUrl.get(url.toString())); }
-
設置http請求方法
.get()
.head()
.post(RequestBody body)
.delete(@Nullable RequestBody body)
.delete()
.put(RequestBody body)
.patch(RequestBody body)
.method(String method, @Nullable RequestBody body)
-
設置http請求的標籤
tag(@Nullable Object tag)
tag(Class<? super T> type, @Nullable T tag)
-
設置http請求header中的Cache-Contro
cacheControl(CacheControl cacheControl)
設置此請求的Cache-Contro
,替換所有已經存在的緩存控制標頭。 如果爲null
,這將清除此請求的緩存控制標頭。
Header介紹
Header
即 http
請求的頭信息,通過以下代碼我們知道header
是由一個 字符串數組 組成的。
public final class Headers {
private final String[] namesAndValues;
Headers(Builder builder) {
this.namesAndValues = builder.namesAndValues.toArray(new String[builder.namesAndValues.size()]);
}
private Headers(String[] namesAndValues) {
this.namesAndValues = namesAndValues;
}
...
}
-
添加頭信息的方法:
我們通過.add("Connection:Keep-Alive")
實際上時是吧Connection:Keep
和Keep-Alive
依次添加到這個保存頭信息的字符串數組中。public Builder add(String line) { int index = line.indexOf(":"); if (index == -1) { throw new IllegalArgumentException("Unexpected header: " + line); } return add(line.substring(0, index).trim(), line.substring(index + 1)); } public Builder add(String name, String value) { checkName(name); checkValue(value, name); return addLenient(name, value); } Builder addLenient(String name, String value) { namesAndValues.add(name); namesAndValues.add(value.trim()); return this; }
-
獲取頭信息的方法:
通過比較單數位的值,來獲取對應索引的下一個索引的值。public String get(String name) { for (int i = namesAndValues.size() - 2; i >= 0; i -= 2) { if (name.equalsIgnoreCase(namesAndValues.get(i))) { return namesAndValues.get(i + 1); } } return null; }
-
刪除頭信息的方法:
依次刪除單數位的值,相同此索引和下一索引的值。public Builder removeAll(String name) { for (int i = 0; i < namesAndValues.size(); i += 2) { if (name.equalsIgnoreCase(namesAndValues.get(i))) { namesAndValues.remove(i); // name namesAndValues.remove(i); // value i -= 2; } } return this; }
-
修改頭信息的方法:
先刪除對應的頭信息,再添加進數組。public Builder set(String name, String value) { (name); checkValue(value, name); removeAll(name); addLenient(name, value); return this; }
以上