JAVA发送HTTP同步请求和异步请求

JAVA发送HTTP同步请求和异步请求

同步请求:每一次执行httpClient.execute方法时都是阻塞的,必须等待到响应才能继续往下走。

CloseableHttpClient httpClient = HttpClients.createDefault();
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            HttpGet httpGet = new HttpGet("https://www.baidu.com");
            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
                int code = response.getStatusLine().getStatusCode();
                if (code == HttpStatus.SC_OK) {
                    HttpEntity entity = response.getEntity();
                    String result = EntityUtils.toString(entity);//获得结果
                    System.out.println("第" + i + "次请求完成");
                }
            }
        }

异步请求:httpClient.execute不阻塞,而是立即返回,执行结果由FutureCallback回调处理,而这个回调在另一个线程中。

发送http请求的这2中模式都有应用场景。在请求量少的场景下,异步并不能体现优势,反而会使代码过于复杂难以维护。 在请求并发量巨大的场景下,异步是不二的选择,比如开发压测工具,同步模式肯定无法胜任,开再多的线程也不行,请求根本发不出去,因为线程都被等待响应的过程占用了,机器性能发挥不出来。

CloseableHttpAsyncClient httpClient = HttpAsyncClients.createDefault();
        httpClient.start();

        for (int i = 0; i < 100; i++) {
            HttpGet httpGet = new HttpGet("https://www.baidu.com");
            httpClient.execute(httpGet, new FutureCallback<HttpResponse>() {
                @Override
                public void completed(HttpResponse response) {
                    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                        HttpEntity entity = response.getEntity();
                        try {
                            String result = EntityUtils.toString(entity);//获得结果
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

                @Override
                public void failed(Exception e) {

                }

                @Override
                public void cancelled() {

                }
            });
        }

原文地址:https://zhuanlan.zhihu.com/p/373732960?ivk_sa=1024609v

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HttpUtils.sendGet是一个同步请求,如果要实现异步请求,可以使用Java中的多线程技术或者使用第三方库,比如OkHttp或者AsyncHttpClient。 使用多线程实现异步请求的示例代码如下: ```java public class MyThread extends Thread { private String url; public MyThread(String url) { this.url = url; } public void run() { // 发送HTTP GET请求 String result = HttpUtils.sendGet(url); // 处理响应结果 // ... } } // 创建线程并启动 MyThread thread = new MyThread("http://www.example.com/api"); thread.start(); ``` 使用OkHttp实现异步请求的示例代码如下: ```java OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://www.example.com/api") .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 请求失败处理 } @Override public void onResponse(Call call, Response response) throws IOException { // 处理响应结果 String result = response.body().string(); // ... } }); ``` 使用AsyncHttpClient实现异步请求的示例代码如下: ```java AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.example.com/api", new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { // 处理响应结果 String result = new String(responseBody); // ... } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // 请求失败处理 } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值