写个OkHTTP客户端请求发不出去

使用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);

你可能感兴趣的:(okhttp)