设为首页 加入收藏

TOP

Okhttp3源码解析(2)-Request分析(一)
2019-09-03 03:36:58 】 浏览:70
Tags:Okhttp3 源码 解析 -Request分析
### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](https://www.jianshu.com/p/bf1d01b79ce7) 今天主要分析下Request源码! ### Request初始化 当我们构建完OkHttpClient对象,需要构造Request对象,构造方式如下: ###### 1.Get请求 ``` final Request request=new Request.Builder() .url("https://www.wanandroid.com/navi/json") .get() .build(); ``` ###### 2.POST请求 拿POST提交表单请求,这时就需要声明一个RequestBody对象了 ``` RequestBody requestBody = new FormBody.Builder() .add("username", "qinzishuai") .add("password", "123456") .build(); Request request = new Request.Builder() .url("https://www.wanandroid.com/user/login") .post(requestBody) .build(); ``` 看到上面代码是不是很熟悉?和OkHttpClient很相似, 没错 Request 的构建也是Builder模式! ![](https://img2018.cnblogs.com/blog/1312938/201908/1312938-20190823180241877-899976016.png) 我们点击Request源码进去,果然 其中有静态的Builder内部类: ![](https://img2018.cnblogs.com/blog/1312938/201908/1312938-20190823180242273-1916386988.png) 然后我们查一下**Request在初始化时配置了哪些参数???** ``` public static class Builder { HttpUrl url; String method; Headers.Builder headers; RequestBody body; public Builder() { this.method = "GET"; this.headers = new Headers.Builder(); } //省略部分代码 public Request build() { if (url == null) throw new IllegalStateException("url == null"); return new Request(this); } } ``` 从代码看到了 如果没有声明,默认是Get请求 ` this.method = "GET"` ,至于`url`等字段需要我们自己去配置: ###### HttpUrl 请求访问的url ,可以传String与URL 具体方法如下: ``` 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())); } ``` ###### method 请求类型 `String method `,支持多种请求类型 ``` public Builder get() { return method("GET", null); } public Builder head() { return method("HEAD", null); } public Builder post(RequestBody body) { return method("POST", body); } public Builder delete(@Nullable RequestBody body) { return method("DELETE", body); } public Builder delete() { return delete(Util.EMPTY_REQUEST); } public Builder put(RequestBody body) { return method("PUT", body); } public Builder patch(RequestBody body) { return method("PATCH", body); } ``` ###### Headers `Headers.Builder ` Http消息的头字段 前面看到了, **我们在初始化Request的时候 同时初始化了headers**, ` this.headers = new Headers.Builder()` 可以通过 `header ` `addHeader ` `removeHeader ` ` headers ` 方法做一些操作 ``` public Builder header(String name, String value) { headers.set(name, value); return this; } public Builder addHeader(String name, String value) { headers.add(name, value); return this; } public Builder removeHeader(String name) { headers.removeAll(name); return this; } public Builder headers(Headers headers) { this.headers = headers.newBuilder(); return this; } ``` ###### body RequestBody类型,它是抽象类, 有些请求需要我们传入body实例 ,我们在通过源码来看一下: 如果是GET请求,body对象传的是null **Get与head方法不能传body对象 ,其他method是可以的** ![](https://img2018.
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android Studio修改Apk打包生成名.. 下一篇Okhttp3源码解析(1)-OkHttpClient..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目