JAVA OkHttp 网络请求链式封装
本帖最后由 zhouen 于 2025-6-16 11:30 编辑###可通过链式快速进行网络请求;示例如下:
```java
package com.ssc.utils;
import okhttp3.*;
import java.util.HashMap;
import java.util.Map;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class OkHttp {
private final OkHttpClient client;
// 单例
private static final OkHttp instance = new OkHttp();
public static OkHttp http() {
return instance;
}
private OkHttp() {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(300, TimeUnit.SECONDS)
.writeTimeout(300, TimeUnit.SECONDS);
// 公共请求头(可自定义)
builder.addInterceptor(chain -> {
Request original = chain.request();
Request request = original.newBuilder()
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.method(original.method(), original.body())
.build();
return chain.proceed(request);
});
params = new HashMap<>();
headersBuilder = new Headers.Builder();
client = builder.build();
}
// 请求构建上下文
private String url;
private String jsonBody;
private Map<String, String> params = new HashMap<>();
private Headers.Builder headersBuilder = new Headers.Builder();
private String method = "GET";
private MediaType mediaType = MediaType.get("application/json; charset=utf-8");
public OkHttp url(String url) {
this.url = url;
return this;
}
public OkHttp addParam(String key, String value) {
params.put(key, value);
return this;
}
public OkHttp addParam(Map<String, String> param) {
params.putAll(param);
return this;
}
public OkHttp addHeader(String key, String value) {
headersBuilder.add(key, value);
return this;
}
public OkHttp json(String jsonBody) {
this.jsonBody = jsonBody;
this.method = "POST";
return this;
}
public OkHttp get() {
this.method = "GET";
return this;
}
public OkHttp post() {
this.method = "POST";
return this;
}
public OkHttp form() {
this.mediaType = MediaType.get("application/x-www-form-urlencoded; charset=utf-8");
FormBody.Builder formBuilder = new FormBody.Builder();
for (Map.Entry<String, String> entry : params.entrySet()) {
formBuilder.add(entry.getKey(), entry.getValue());
}
this.jsonBody = null;
this.params.clear();
return this;
}
public void execute(Callback callback) throws IOException {
RequestBody body = null;
if ("POST".equalsIgnoreCase(method)) {
if (mediaType.equals(MediaType.get("application/x-www-form-urlencoded; charset=utf-8"))) {
FormBody.Builder formBuilder = new FormBody.Builder();
for (Map.Entry<String, String> entry : params.entrySet()) {
formBuilder.add(entry.getKey(), entry.getValue());
}
body = formBuilder.build();
} else if (jsonBody != null && !jsonBody.isEmpty()) {
body = RequestBody.create(jsonBody, mediaType);
} else {
body = RequestBody.create("", mediaType);
}
}
else if ("GET".equalsIgnoreCase(method)) {
HttpUrl.Builder builder = Objects.requireNonNull(HttpUrl.parse(url)).newBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.addQueryParameter(entry.getKey(), entry.getValue());
}
url = builder.build().toString();
}
Request request = new Request.Builder()
.url(url)
.method(method, body)
.headers(headersBuilder.build())
.build();
client.newCall(request).enqueue(callback);
}
public Response execute() throws IOException {
RequestBody body = null;
if ("POST".equalsIgnoreCase(method)) {
if (mediaType.equals(MediaType.get("application/x-www-form-urlencoded; charset=utf-8"))) {
FormBody.Builder formBuilder = new FormBody.Builder();
for (Map.Entry<String, String> entry : params.entrySet()) {
formBuilder.add(entry.getKey(), entry.getValue());
}
body = formBuilder.build();
} else if (jsonBody != null && !jsonBody.isEmpty()) {
body = RequestBody.create(jsonBody, mediaType);
} else {
body = RequestBody.create("", mediaType);
}
}
Request request = new Request.Builder()
.url(url)
.method(method, body)
.headers(headersBuilder.build())
.build();
return client.newCall(request).execute();
}
public static void main(String[] args) {
try {
//同步 GET 请求:
Response response = OkHttp.http()
.url("https://api.example.com/data")
.get()
.execute();
if (response.isSuccessful() && response.body() != null) {
System.out.println(response.body().string());
}
//异步 POST JSON 请求
OkHttp.http()
.url("https://api.example.com/login")
.post()
.json("{\"username\":\"admin\",\"password\":\"123456\"}")
.execute(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.err.println("请求失败: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful() && response.body() != null) {
System.out.println("登录成功: " + response.body().string());
} else {
System.err.println("服务器返回错误: " + response.code());
}
}
});
//同步post
Response response1 = OkHttp.http()
.url("https://api.example.com/login")
.post()
.json("{\"username\":\"admin\",\"password\":\"123456\"}")
.execute(); // 同步执行
if (response1.isSuccessful() && response1.body() != null) {
System.out.println("响应结果: " + response1.body().string());
} else {
System.err.println("请求失败,状态码: " + response1.code());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
okhttp + retrofit 有点像Jsoup.connect laoser 发表于 2025-6-14 14:17
okhttp + retrofit
仅Java后端网络请求用的简单封装;
安卓开发的话,搭配retrofit使用最佳 学习学习不错~
页:
[1]