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

文章描述了一位开发者在使用OkHTTP进行http请求时遇到请求无法发出的问题,通过分析网络连接、请求参数、异步回调和服务器端可能的问题,最终发现是由于主线程提前终止导致后台线程无法执行请求。通过调整测试用例,确保主线程保持活动,成功实现了异步请求。
摘要由CSDN通过智能技术生成

使用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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱运动的跑者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值