(今天接触了Http请求框架,搜索了一篇关于okHttp框架的博文,在此备份。)
okHttp: OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存。默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题。如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。
An HTTP & SPDY client for Android and Java applications 从Android4.4开始HttpURLConnection的底层实现采用的是okHttp.使用要求:对于Android:2.3以上,对于Java:java7以上 两个模块: okhttp-urlconnection实现.HttpURLConnection API; okhttp-apache实现Apache HttpClient API.
依赖:okio(https://github.com/square/okio): Okio, which OkHttp uses for fast I/O and resizable buffers.
1
2
3
4
5
|
okhttp
2.3
.
0
|
1
|
compile
'com.squareup.okhttp:okhttp:2.3.0'
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
private
final
OkHttpClient client =
new
OkHttpClient();
public
void
run()
throws
Exception {
Request request =
new
Request.Builder()
.url(http:
//publicobject.com/helloworld.txt)
.build();
Response response = client.newCall(request).execute();
if
(!response.isSuccessful())
throw
new
IOException(Unexpected code + response);
Headers responseHeaders = response.headers();
for
(
int
i =
0
; i < responseHeaders.size(); i++) {
System.out.println(responseHeaders.name(i) + : + responseHeaders.value(i));
}
System.out.println(response.body().string());
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
private
final
OkHttpClient client =
new
OkHttpClient();
public
void
run()
throws
Exception {
Request request =
new
Request.Builder()
.url(http:
//publicobject.com/helloworld.txt)
.build();
client.newCall(request).enqueue(
new
Callback() {
@Override
public
void
onFailure(Request request, Throwable throwable) {
throwable.printStackTrace();
}
@Override
public
void
onResponse(Response response)
throws
IOException {
if
(!response.isSuccessful())
throw
new
IOException(Unexpected code + response);
Headers responseHeaders = response.headers();
for
(
int
i =
0
; i < responseHeaders.size(); i++) {
System.out.println(responseHeaders.name(i) + : + responseHeaders.value(i));
}
System.out.println(response.body().string());
}
});
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
private
final
OkHttpClient client =
new
OkHttpClient();
public
void
run()
throws
Exception {
Request request =
new
Request.Builder()
.url(https:
//api.github.com/repos/square/okhttp/issues)
.header(User-Agent, OkHttp Headers.java)
.addHeader(Accept, application/json; q=
0.5
)
.addHeader(Accept, application/vnd.github.v3+json)
.build();
Response response = client.newCall(request).execute();
if
(!response.isSuccessful())
throw
new
IOException(Unexpected code + response);
System.out.println(Server: + response.header(Server));
System.out.println(Date: + response.header(Date));
System.out.println(Vary: + response.headers(Vary));
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
static
final
MediaType jsonReq
= MediaType.parse(application/json; charset=utf-
8
);
OkHttpClient client =
new
OkHttpClient();
String post(String url, String json)
throws
IOException {
RequestBody body = RequestBody.create(jsonReq, json);
Request request =
new
Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
return
response.body().string();
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
public
static
final
MediaType MEDIA_TYPE_MARKDOWN
= MediaType.parse(text/x-markdown; charset=utf-
8
);
private
final
OkHttpClient client =
new
OkHttpClient();
public
void
run()
throws
Exception {
RequestBody requestBody =
new
RequestBody() {
@Override
public
MediaType contentType() {
return
MEDIA_TYPE_MARKDOWN;
}
@Override
public
void
writeTo(BufferedSink sink)
throws
IOException {
sink.writeUtf8(Numbers
);
sink.writeUtf8(-------
);
for
(
int
i =
2
; i <=
997
; i++) {
sink.writeUtf8(String.format( * %s = %s
, i, factor(i)));
}
}
private
String factor(
int
n) {
for
(
int
i =
2
; i < n; i++) {
int
x = n / i;
if
(x * i == n)
return
factor(x) + × + i;
}
return
Integer.toString(n);
}
};
Request request =
new
Request.Builder()
.url(https:
//api.github.com/markdown/raw)
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
if
(!response.isSuccessful())
throw
new
IOException(Unexpected code + response);
System.out.println(response.body().string());
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
static
final
MediaType MEDIA_TYPE_MARKDOWN
= MediaType.parse(text/x-markdown; charset=utf-
8
);
private
final
OkHttpClient client =
new
OkHttpClient();
public
void
run()
throws
Exception {
File file =
new
File(README.md);
Request request =
new
Request.Builder()
.url(https:
//api.github.com/markdown/raw)
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
.build();
Response response = client.newCall(request).execute();
if
(!response.isSuccessful())
throw
new
IOException(Unexpected code + response);
System.out.println(response.body().string());
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private
final
OkHttpClient client =
new
OkHttpClient();
public
void
run()
throws
Exception {
RequestBody formBody =
new
FormEncodingBuilder()
.add(search, Jurassic Park)
.build();
Request request =
new
Request.Builder()
.url(https:
//en.wikipedia.org/w/index.php)
.post(formBody)
.build();
Response response = client.newCall(request).execute();
if
(!response.isSuccessful())
throw
new
IOException(Unexpected code + response);
System.out.println(response.body().string());
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
private
static
final
String IMGUR_CLIENT_ID = ...;
private
static
final
MediaType MEDIA_TYPE_PNG = MediaType.parse(image/png);
private
final
OkHttpClient client =
new
OkHttpClient();
public
void
run()
throws
Exception {
// Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image
RequestBody requestBody =
new
MultipartBuilder()
.type(MultipartBuilder.FORM)
.addPart(
Headers.of(Content-Disposition, form-data; name= itle),
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();
Request request =
new
Request.Builder()
.header(Authorization, Client-ID + IMGUR_CLIENT_ID)
.url(https:
//api.imgur.com/3/image)
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
if
(!response.isSuccessful())
throw
new
IOException(Unexpected code + response);
System.out.println(response.body().string());
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
private
final
OkHttpClient client =
new
OkHttpClient();
private
final
Gson gson =
new
Gson();
public
void
run()
throws
Exception {
Request request =
new
Request.Builder()
.url(https:
//api.github.com/gists/c2a7c39532239ff261be)
.build();
Response response = client.newCall(request).execute();
if
(!response.isSuccessful())
throw
new
IOException(Unexpected code + response);
Gist gist = gson.fromJson(response.body().charStream(), Gist.
class
);
for
(Map.Entry
System.out.println(entry.getKey());
System.out.println(entry.getValue().content);
}
}
static
class
Gist {
Map
}
static
class
GistFile {
String content;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
private
final
OkHttpClient client;
public
CacheResponse(File cacheDirectory)
throws
Exception {
int
cacheSize =
10
*
1024
*
1024
;
// 10 MiB
Cache cache =
new
Cache(cacheDirectory, cacheSize);
client =
new
OkHttpClient();
client.setCache(cache);
}
public
void
run()
throws
Exception {
Request request =
new
Request.Builder()
.url(http:
//publicobject.com/helloworld.txt)
.build();
Response response1 = client.newCall(request).execute();
if
(!response1.isSuccessful())
throw
new
IOException(Unexpected code + response1);
String response1Body = response1.body().string();
System.out.println(Response
1
response: + response1);
System.out.println(Response
1
cache response: + response1.cacheResponse());
System.out.println(Response
1
network response: + response1.networkResponse());
}
|
1
2
|
final
Call call = client.newCall(request);
call.cancel();
|
1
2
3
4
5
6
7
8
|
private
final
OkHttpClient client;
public
ConfigureTimeouts()
throws
Exception {
client =
new
OkHttpClient();
client.setConnectTimeout(
10
, TimeUnit.SECONDS);
client.setWriteTimeout(
10
, TimeUnit.SECONDS);
client.setReadTimeout(
30
, TimeUnit.SECONDS);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
private
final
OkHttpClient client =
new
OkHttpClient();
public
void
run()
throws
Exception {
client.setAuthenticator(
new
Authenticator() {
@Override
public
Request authenticate(Proxy proxy, Response response) {
System.out.println(Authenticating
for
response: + response);
System.out.println(Challenges: + response.challenges());
String credential = Credentials.basic(jesse, password1);
return
response.request().newBuilder()
.header(Authorization, credential)
.build();
}
@Override
public
Request authenticateProxy(Proxy proxy, Response response) {
return
null
;
// Null indicates no attempt to authenticate.
}
});
Request request =
new
Request.Builder()
.url(http:
//publicobject.com/secrets/hellosecret.txt)
.build();
Response response = client.newCall(request).execute();
if
(!response.isSuccessful())
throw
new
IOException(Unexpected code + response);
System.out.println(response.body().string());
}
|
1
2
3
4
5
6
7
8
9
10
11
|
if
(responseCount(response) >=
3
) {
return
null
;
// If we've failed 3 times, give up.
}
//添加以下方法
private
int
responseCount(Response response) {
int
result =
1
;
while
((response = response.priorResponse()) !=
null
) {
result++;
}
return
result;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class
LoggingInterceptor
implements
Interceptor {
@Override
public
Response intercept(Chain chain)
throws
IOException {
Request request = chain.request();
long
t1 = System.nanoTime();
logger.info(String.format(Sending request %s on %s%n%s,
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long
t2 = System.nanoTime();
logger.info(String.format(Received response
for
%s in %.1fms%n%s,
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return
response;
}
}
|
1
2
|
OkHttpClient client =
new
OkHttpClient();
client.interceptors().add(
new
LoggingInterceptor());
|
1
2
|
OkHttpClient client =
new
OkHttpClient();
client.networkInterceptors().add(
new
LoggingInterceptor());
|