首先要想在安卓中使用okhttp先进行配置。
①在app的build.gradle中添加依赖:
implementation("com.squareup.okhttp3:okhttp:4.9.0")
②在AndroidManifest.xml中添加联网权限:
<uses-permission android:name="android.permission.INTERNET"/>
get同步:
okHttpClient = new OkHttpClient(); //全局变量
public void getSync(View view) {
new Thread(new Runnable() {
@Override
public void run() {
Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
Log.i("TAG", "getSync: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
①首先全局变量创建一个OkHttpClient实例。
②在安卓中,必须要求创建一个线程去执行服务器请求命令:依据所需的url创建一个Request,由该request获取其call。
接下来对call.execute获取回执,并且其中body就是连接服务器后获取的信息。
get异步:
okHttpClient = new OkHttpClient(); //全局变量
public void getAsync(View view) {
Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").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 {
if (response.isSuccessful()) {
Log.i("TAG", "getAsync: " + response.body().string());
}
}
});
}
异步请求过程前面和同步一样,获取okhttpclient,创建request,获取call。
接着下一步执行call.enqueue()并直接创建其需要的callback实例。
其中两个方法表示获取失败及获取成功、对获取内容的操作。
但这里的获取成功并不一定是真的成功(例如url写错的话,也会执行到onResponse里),需要额外对response的响应码进行正确与否的判断达到判断成功的目的。
注:同步异步的区别:
在同步代码中,通常会发生阻塞,即代码在excute后会进行连接等费时操作,代码也就在这一行等待。并且同步需要我们自己写线程执行。
而在异步代码中,okhttp会在call.enqueue中自动创建线程(不用我们在代码中创建线程),并且在enqueue代码执行完后,并不会阻塞在此处,而是直接继续执行enqueue整个代码块后续的代码。
post同步:
okHttpClient = new OkHttpClient(); //全局变量
public void postSync(View view) {
new Thread(new Runnable() {
@Override
public void run() {
FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
Request request = new Request.Builder().url("https://www.httpbin.org/post")
.post(formBody).build();
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
Log.i("TAG", "postSync: " + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
post同步整体和get同步类似。
在get请求中,我们把需要的参数放在url后面https://www.httpbin.org/get?a=1&b=2
即get?a=1&b=2。
而在post中,不写在url中,而是通过创建formbody.add添加进去,并且url也要对应修改为https://www.httpbin.org/post
request获取默认调用的是get请求,若需要调用post请求需要依据formbody进行额外操作。
post异步:
okHttpClient = new OkHttpClient(); //全局变量
public void postAsync(View view) {
FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
Request request = new Request.Builder().url("https://www.httpbin.org/post")
.post(formBody).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 {
if (response.isSuccessful()) {
Log.i("TAG", "postAsync: " + response.body().string());
}
}
});
}
同get操作流程和post自身特性。