下面是一个用 OkHttp 封装的 GET 请求方法,适用于 Android 项目。该方法包括基本的网络请求、错误处理,并支持通过回调返回结果。
封装 GET 请求的工具类
- 添加依赖
在你的 build.gradle 文件中,确保添加了 OkHttp 的依赖:
implementation 'com.squareup.okhttp3:okhttp:4.11.0'
- 工具类代码
创建一个工具类 HttpUtil,封装 GET 请求。
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class HttpUtil {
private static final OkHttpClient client = new OkHttpClient();
/**
* 封装的 GET 请求方法
* @param url 请求的 URL 地址
* @param callback 回调接口,用于处理结果
*/
public static void sendGetRequest(String url, HttpCallback callback) {
// 构建请求
Request request = new Request.Builder()
.url(url)
.get()
.build();
// 发起请求
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 请求失败
if (callback != null) {
callback.onFailure(e);
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (callback != null) {
if (response.isSuccessful()) {
// 请求成功
callback.onSuccess(response.body().string());
} else {
// 请求失败(HTTP 状态码非 2xx)
callback.onFailure(new IOException("Unexpected code " + response.code()));
}
}
}
});
}
/**
* 回调接口,用于处理 HTTP 请求的结果
*/
public interface HttpCallback {
void onSuccess(String responseBody);
void onFailure(Exception e);
}
}
使用示例
在 Activity 或其他地方调用 sendGetRequest 方法:
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 示例 GET 请求
String url = "https://jsonplaceholder.typicode.com/posts";
HttpUtil.sendGetRequest(url, new HttpUtil.HttpCallback() {
@Override
public void onSuccess(String responseBody) {
// 请求成功,处理响应
Log.d(TAG, "Response: " + responseBody);
}
@Override
public void onFailure(Exception e) {
// 请求失败,处理错误
Log.e(TAG, "Error: " + e.getMessage(), e);
}
});
}
}
说明
回调接口:HttpCallback 用于处理异步请求的结果,分别有 onSuccess 和 onFailure 方法。
异步操作:OkHttp 的 enqueue 方法在后台线程中运行,因此无需担心主线程阻塞。
错误处理:在 onFailure 中返回异常信息,方便排查问题。
- 没有参数的 GET 请求
- 如果你不需要传递参数,只需发送一个简单的 GET 请求即可:
// URL 不带参数
String url = "https://jsonplaceholder.typicode.com/posts";
HttpUtil.sendGetRequest(url, new HttpUtil.HttpCallback() {
@Override
public void onSuccess(String responseBody) {
// 请求成功,处理响应
Log.d(TAG, "Response: " + responseBody);
}
@Override
public void onFailure(Exception e) {
// 请求失败,处理错误
Log.e(TAG, "Error: " + e.getMessage(), e);
}
});
- 带参数的 GET 请求
如果你需要在 URL 中传递查询参数,可以通过 HttpUrl 或直接将参数拼接到 URL 字符串中。
方法一:手动拼接查询参数
// 带查询参数的 URL
String baseUrl = "https://jsonplaceholder.typicode.com/posts";
String userId = "1"; // 假设你要传递一个 userId 参数
String url = baseUrl + "?userId=" + userId; // 拼接查询参数
HttpUtil.sendGetRequest(url, new HttpUtil.HttpCallback() {
@Override
public void onSuccess(String responseBody) {
// 请求成功,处理响应
Log.d(TAG, "Response: " + responseBody);
}
@Override
public void onFailure(Exception e) {
// 请求失败,处理错误
Log.e(TAG, "Error: " + e.getMessage(), e);
}
});
方法二:使用 HttpUrl 进行参数编码
HttpUrl 可以帮助你更安全地构建带有查询参数的 URL,自动处理参数编码:
HttpUrl url = HttpUrl.parse("https://jsonplaceholder.typicode.com/posts").newBuilder()
.addQueryParameter("userId", "1")
.addQueryParameter("id", "2") // 添加多个查询参数
.build();
HttpUtil.sendGetRequest(url.toString(), new HttpUtil.HttpCallback() {
@Override
public void onSuccess(String responseBody) {
// 请求成功,处理响应
Log.d(TAG, "Response: " + responseBody);
}
@Override
public void onFailure(Exception e) {
// 请求失败,处理错误
Log.e(TAG, "Error: " + e.getMessage(), e);
}
});
数据解析:
GsonFormat的使用