OkHttp 实战:表单与 JSON 数据上传全解析
在 Android 开发和网络请求中,OkHttp 凭借其高效、简洁的特性成为主流的网络请求库,本文将详细介绍如何使用 OkHttp 上传表单数据和 JSON 数据,涵盖基本用法、代码示例及注意事项,帮助开发者快速这一常用技能。
OkHttp 上传表单数据
表单数据上传是网络开发中的常见需求,OkHttp 提供了多种方式来处理表单请求,包括 application/x-www-form-urlencoded 和 multipart/form-data 两种主要格式。
1 上传 application/x-www-form-urlencoded 格式表单
这种格式适用于简单的键值对数据上传,类似于 HTML 中的 <form> 默认提交方式。
OkHttpClient client = new OkHttpClient();
// 构建表单数据
FormBody.Builder formBuilder = new FormBody.Builder()
.add("username", "zhangsan")
.add("password", "123456")
.add("age", "25");
Request request = new Request.Builder()
.url("https://example.com/api/login")
.post(formBuilder.build())
.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()) {
String responseData = response.body().string();
Log.d("FormResponse", responseData);
}
}
});
代码解析:
- 使用
FormBody.Builder构建表单数据,通过add()方法添加键值对 - 通过
post(formBuilder.build())设置请求体为表单数据 - 使用
enqueue()异步提交请求,也可使用execute()同步提交
2 上传 multipart/form-data 格式表单
这种格式支持文件上传和复杂表单数据,每个表单项可以是文本或文件。
OkHttpClient client = new OkHttpClient();
// 构建 multipart 请求体
MultipartBody multipartBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("username", "lisi")
.addFormDataPart("avatar", "avatar.jpg",
RequestBody.create(MediaType.parse("image/jpeg"),
new File("/path/to/avatar.jpg")))
.addFormDataPart("description", "This is my avatar")
.build();
Request request = new Request.Builder()
.url("https://example.com/api/upload")
.post(multipartBody)
.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()) {
String responseData = response.body().string();
Log.d("MultipartResponse", responseData);
}
}
});
代码解析:
- 使用
MultipartBody.Builder构建 multipart 请求体 setType(MultipartBody.FORM)设置类型为表单addFormDataPart()方法用于添加文本或文件数据- 文件数据需要指定文件名、MediaType 和文件内容
OkHttp 上传 JSON 数据
JSON 是现代 API 交互中最常用的数据格式,OkHttp 上传 JSON 数据主要通过 RequestBody 实现。
1 上传简单 JSON 数据
OkHttpClient client = new OkHttpClient();
// 构建 JSON 数据
String json = "{\"name\":\"wangwu\",\"age\":30,\"email\":\"wangwu@example.com\"}";
RequestBody requestBody = RequestBody.create(
MediaType.parse("application/json; charset=utf-8"),
json
);
Request request = new Request.Builder()
.url("https://example.com/api/user")
.post(requestBody)
.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()) {
String responseData = response.body().string();
Log.d("JSONResponse", responseData);
}
}
});
代码解析:
- 使用
RequestBody.create()方法创建 JSON 请求体 MediaType.parse("application/json; charset=utf-8")指定内容类型为 JSON- 直接将 JSON 字符串作为请求体内容
2 使用 Gson 上传复杂 JSON 对象
对于复杂的 JSON 对象,可以结合 Gson 库进行序列化:
OkHttpClient client = new OkHttpClient();
Gson gson = new Gson();
// 构建 JSON 对象
User user = new User();
user.setName("zhaoliu");
user.setAge(28);
user.setEmail("zhaoliu@example.com");
user.setHobbies(new String[]{"reading", "swimming"});
// 将对象转换为 JSON 字符串
String json = gson.toJson(user);
RequestBody requestBody = RequestBody.create(
MediaType.parse("application/json; charset=utf-8"),
json
);
Request request = new Request.Builder()
.url("https://example.com/api/user")
.post(requestBody)
.addHeader("Accept", "application/json")
.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()) {
String responseData = response.body().string();
Log.d("ComplexJSONResponse", responseData);
}
}
});
代码解析:
- 使用 Gson 将 Java 对象转换为 JSON 字符串
- 可以处理嵌套对象和数组等复杂数据结构
- 通过
addHeader()添加请求头,如Accept头指定期望的响应格式
注意事项与最佳实践
- 资源释放:确保在请求完成后调用
response.body().close()或使用try-finally确保资源释放 - 线程处理:OkHttp 的回调在子线程执行,如需更新 UI 需切换到主线程
- 错误处理:妥善处理网络异常和服务器错误
- 数据大小:大文件上传时注意监控进度,避免内存溢出
- 超时设置:根据需求设置连接、读取和写入超时时间
- HTTPS:生产环境建议使用 HTTPS,确保数据传输安全
本文详细介绍了 OkHttp 上传表单数据和 JSON 数据的多种方式,从简单的键值对表单到复杂的 multipart 文件上传,以及基础的 JSON 字符串和复杂对象的序列化上传,这些技能后,开发者可以灵活应对各种网络请求场景,构建更加健壮和高效的网络应用,在实际开发中,建议根据具体需求选择合适的数据上传方式,并遵循最佳实践确保应用的稳定性和安全性。



还没有评论,来说两句吧...