OkHttp是一个高效的HTTP客户端,用于Java和Android应用。它支持同步和异步调用、连接池、GZIP压缩、缓存等特性,使得网络请求更加高效和简单。
OkHttp由Square公司开发,并且被广泛应用于各种场景,如API调用、文件上传下载等。它还提供了丰富的功能,比如拦截器、超时设置、重试机制等。
在Java项目中使用OkHttp,可以通过Maven或Gradle引入依赖。
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
以下是一个简单的同步GET请求示例:
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful() && response.body() != null) {
System.out.println(response.body().string());
} else {
System.out.println("Request failed: " + response.code());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
解释:
OkHttpClient
实例。Request.Builder
构建请求对象。client.newCall(request).execute()
执行同步请求。异步请求允许程序在等待网络响应时继续执行其他任务。
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpAsyncExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful() && response.body() != null) {
System.out.println(response.body().string());
} else {
System.out.println("Request failed: " + response.code());
}
}
});
}
}
解释:
enqueue(Callback)
方法用于发起异步请求。onResponse
回调中处理成功的响应。onFailure
回调中处理失败的情况。发送POST请求时,可以使用RequestBody
来构建请求体。
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpPostExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
MediaType JSON = MediaType.get("application/json; charset=utf-8");
String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful() && response.body() != null) {
System.out.println(response.body().string());
} else {
System.out.println("Request failed: " + response.code());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
解释:
MediaType
指定内容类型为JSON。RequestBody
对象,并将其附加到请求中。.post(body)
方法发送POST请求。OkHttp支持拦截器,可以在请求发送前或响应接收后对数据进行处理。
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpInterceptorExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.build();
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful() && response.body() != null) {
System.out.println(response.body().string());
} else {
System.out.println("Request failed: " + response.code());
}
} catch (IOException e) {
e.printStackTrace();
}
}
static class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
System.out.println(String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
System.out.println(String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
}
解释:
LoggingInterceptor
类实现日志记录功能。OkHttpClient.Builder
中添加拦截器。OkHttpClient.Builder
设置读取、写入和连接超时时间。