最近在做项目的时候,遇到一个接口请求中需要处理多个网络外部请求处理的情况,由于第二个网络请求依赖于第一个请求的结果,才能进行,因此在使用上了解查看了两种请求情况。
第一种
Map<Object, Object> map = new TreeMap<>();
map.put("test","请求参数");
OkHttpClient okHttpClient = new OkHttpClient();
MediaType json = MediaType.parse("application/json;charset=utf-8");
okhttp3.RequestBody requestBody = RequestBody.create(json, JSON.toJSONString(map));
Request.Builder builder = new Request.Builder();
Request request1 = builder.url(url).post(requestBody).build();
Response response = okHttpClient.newCall(request1).execute();
String resp = response.body().string();
通过上面的请求示例,可以看到在发起网络请求后,结果信息会在拿到后,才会返回当前方法。
第二种执行 call 函数得到结果后,进行回调。
Map<Object, Object> map = new TreeMap<>();
map.put("test","请求参数");
OkHttpClient okHttpClient = new OkHttpClient();
MediaType json = MediaType.parse("application/json;charset=utf-8");
okhttp3.RequestBody requestBody = RequestBody.create(json, JSON.toJSONString(map));
Request.Builder builder = new Request.Builder();
Request request1 = builder.url(url).post(requestBody).build();
Call call = okHttpClient.newCall(request1);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println(call);
}
//请求成功时调用
@Override
public void onResponse(Call call, Response response) throws IOException {
//处于子线程中,能够进行大文件下载,但是无法更新UI
final String res = response.body().string();//请求成功时返回的东西
System.out.println(response.body().string());
// 解析接口返回的数据
}
});
如果在一个请求中,两种对外的请求都使用第二种方式,就会出现请求1在还未收到结果时,就会发送第二条请求,这显然不是我们想要的结果。
第二种方式在发送请求的时候等于说是创建了一个异步的线程后等待结果返回。所以在使用时比较推荐使用第一种请求方式。