使用 OkHttp
OkHttp 是 Android 目前最流行的网络请求库,有很多厂商支持,其他包括 Google。 由于 OkHttp 比较底层,市场上还有一些基于 OkHttp 封装的网络请求库,例如 Retrofit 等..
OkHttp Github 的地址是 。 使用 OkHttp,第一步需要在 app/build.gradle 这个文件导入依赖。
dependencies {
...
// 当前最新版本是 4.10.0,这句代码可以在 OkHttp 的 Github 文档获得
// 写上这句代码,别忘了点一下上面的 sync now 按钮更新依赖
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
...
}
完成了 OkHttp 依赖的更新,还需要开启一下安卓的用户网络权限,在 AndroidManifest.xml 文件添加下面这句:
<uses-permission android:name="android.permission.INTERNET" />
OkHttp 异步 Get 请求
我们在 MainActivity.java 新建一个 getAsync() 的方法,通过 httpbin.org 这个服务器,作为我们的测试地址。 httpbin.org 有很多的方法,/get?a=b 方法,我们提交什么 get 参数过去,就会返回什么 get 参数。
private void getAsync() {
OkHttpClient okHttpCline = new OkHttpClient();
Request request = new Request.Builder().url("https://httpbin.org/get?a=b").build();
Call call = okHttpCline.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
// 请求失败调用
Log.d("okHttp", e.getMessage());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
// 请求成功调用
Log.d("okHttp", "onResponse");
// 获取 body 数据
String body = response.body().string();
Log.d("okHttp", body);
}
});
}
请求成功,就会执行到 onResponse 方法,我们通过 response.body().string() 获取到 body 的数据,是一个 JSON 对象,接下来,我们可以通过 JSONObject 对象进行 JSON 数据解析。
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
// 获取 body 数据
if (response.isSuccessful()) {
String body = response.body().string();
// JSON 解析
try {
JSONObject jsonObj = new JSONObject(body);
String args = jsonObj.getString("args");
Log.d("okHttp", args);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
OkHttp 异步 Post Form 表单请求
我们在新建一个 postAsync 方法,同样用 httpbin.org 这个服务器作为测试服务器,这次我们使用的是 https://httpbin.org/post 接口。
private void postAsync() {
OkHttpClient okHttpClient = new OkHttpClient();
// 构建表单数据
FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
// 构建 Request 请求
Request request = new Request.Builder().post(formBody).url("https://httpbin.org/post").build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String JSONStr = response.body().string();
Log.d("okHttp", JSONStr);
}
});
}
我们使用 FormBody 构建的其实是对应了 http 的 x-www-form-urlencoded 方法,这是一种 post 提交数据的常见方法,如果我们需要提交文件,那就需要用到 form-data 方法。
form-data 上传文件
上传文件需要使用到 MultipartBody 对象,同时还需要用到 RequestBody 构建图片对象。
private void Upload() {
Log.d("okHttp", "start Upload");
OkHttpClient okHttpClient = new OkHttpClient();
File file1 = new File("C:\\Users\\Admin\\Desktop\\1.txt");
// 构建 multipart 数据
// 数据有两个部分,一个是 a:b 的参数,和一个 txt 文件
MultipartBody multipartBody = new MultipartBody.Builder().addFormDataPart("a", "1")
.addFormDataPart("file1", file1.getName(), RequestBody.create(file1, MediaType.parse("text/plain"))).build();
// 构建 request 请求
Request request = new Request.Builder().post(multipartBody).url("https://httpbin.org/post").build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String JSONStr = response.body().string();
Log.d("okHttp", JSONStr);
}
});
}
Post JSON 数据
发送 JSON 数据比较简单,使用 RequestBody 对象构建 JSON 数据到 post 方法里就可以。
private void postJson() {
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = RequestBody.create("{\"a\": 1, \"b\": 2}", MediaType.parse("application/json"));
Request request = new Request.Builder().url("https://httpbin.org/post").post(requestBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
Log.d("okHttp", response.body().string());
}
});
}