使用OkHTTP写了个http请求工具,结果本地测试得过程中请求发不出去,很是不解,经过一番折腾终于搞明白,分享一下处理过程。
定义方法
public static void get(String url, Map<String, String> headers, Map<String, String> params, Callback callback) {
HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
if (params != null) {
for (Map.Entry<String, String> entry : params.entrySet()) {
urlBuilder.addQueryParameter(entry.getKey(), entry.getValue());
}
}
Request.Builder requestBuilder = new Request.Builder().url(urlBuilder.build());
if (headers != null) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
requestBuilder.addHeader(entry.getKey(), entry.getValue());
}
}
Request request = requestBuilder.build();
client.newCall(request).enqueue(callback);
}
编写测试用例
RequestClient.get("http://127.0.0.1:9091/sample/hello", new HashMap<>(), param, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println(response.body());
}
});
运行不理想,既不报错,服务端也没收到请求,为什么呢?
理论上发出请求,服务端收不到请求无非下面这几种可能性:
- 网络连接问题:请确保你的应用程序可以访问目标服务器,并且网络连接正常。你可以尝试通过浏览器或其他工具访问该服务器,以确保网络连接没有问题。
- 请求参数错误:请检查request对象中的URL、请求方法、请求头和请求体等参数是否正确设置。确保你提供的参数是有效的,并符合服务器端的要求。
- 异步回调问题:enqueue(callback)方法是用于异步执行请求的,它会在后台线程中执行网络请求,并在请求完成后调用回调函数。确保你的回调函数实现正确,能够处理请求完成后的响应或错误。
- 服务器端问题:如果你确定网络连接和请求参数都没有问题,那么可能是服务器端出现了问题。服务器可能无法响应请求,或者返回了错误的响应。你可以尝试使用其他工具发送相同的请求,以确定是否是服务器端的问题。
于是更换代码client.newCall(request).enqueue(callback)
为client.newCall(request).execute()
,结果请求出去了。但我就想试试异步请求,百思之后想起来:
enqueue(callback)方法会在后台线程中执行网络请求和回调函数。需要确保应用程序的主线程没有在请求发送之前就终止了。如果主线程结束,那么后台线程也会随之结束,导致请求无法完成。
最后修改测试用例如下,成功了:
RequestClient.get("http://127.0.0.1:9091/sample/hello", new HashMap<>(), param, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println(response.body());
}
});
Thread.sleep(5000L);