OkHttp源码解析(一):基本使用

OkHttp可以说是Android界最为牛X的网络框架没有之一,GitHub上stat数量26k+,如果你熟悉iOS开发,那么你肯定听说过AFNetworking网络框架了,OkHttp就相当于Android界的AFNetworking了,由square公司出品,Android大神Jake Wharton打造,下面我们一起来了解一下这个框架。

基本用法

1
2
3
4
5
6
7
8
9
10
11
//1、构建OkHttpClient
OkHttpClient client = new OkHttpClient();
//2、构建Request
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
//3、创建Call对象
Call call = client.newCall(request);
//4、执行请求
call.enqueue(callback); 异步
call.execute() 同步

这就是整个请求流程,如果要获取返回结果,OkHttp封装了一个Response对象,我们可以通过这个对象获取到这些东东。

1
2
3
response.body().string()
response.body().bytes()
response.body().byteStream()

可以看到有字符串和字节流,普通的文本和文件下载都是支持的

GET请求

1
2
3
new Request.Builder().get()
.url("http://www.baidu.com")
.build()

这个是不带参数的get请求方式,但是通常我们不都要带一点嘛,可以通过这种方式去添加参数

1
2
3
4
request.url()
.newBuilder()
.addQueryParameter("name", "value")
.build();

当然如果你引入了Retrofit的支持,那么可以利用这两个注解来完成参数的添加。

1
2
1、@Query
2、@QueryMap

POST请求

POST一个JSON串
1
2
3
4
5
6
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, json);
new Request.Builder()
.url(url)
.post(body)
.build();

POST一个字符串

1
2
3
4
5
6
MediaType MARKDOWN= MediaType.parse("text/x-markdown; charset=utf-8");
RequestBody body = RequestBody.create(MARKDOWN, str);
new Request.Builder()
.url(url)
.post(body)
.build();

因为请求体在内存中,避免大于1M

POST键值对

1
2
3
4
5
RequestBody formBody = new FormEncodingBuilder()
.add("aaa", "a")
.add("bbb", "b")
.add("ccc", "c")
.build();

POST流

1
2
3
4
5
6
7
8
9
10
new RequestBody() {
@Override public MediaType contentType() {
return MEDIA_TYPE_MARKDOWN;
}

@Override public void writeTo(BufferedSink sink) throws IOException {
sink.writeUtf8("Numbers\n");
sink.writeUtf8("-------\n");
}
};

POST分块请求

1
2
3
4
5
6
7
8
9
new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addPart(
Headers.of("Content-Disposition", "form-data; name=\"title\""),
RequestBody.create(null, "Square Logo"))
.addPart(
Headers.of("Content-Disposition", "form-data; name=\"image\""),
RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))
.build();
您的支持是我原创的动力