http异步请求 java_java实现 http请求的同步和异步发送

http同步请求 一般使用httpClient实现

private void sendRequest() throws Exception{

String path ="/statistic/info";

CloseableHttpClient httpClient = HttpClients.createDefault();

// 创建一个 GET 请求

HttpGet httpGet = new HttpGet(path);

// 执行请求

CloseableHttpResponse response =httpClient.execute(httpGet);

//取响应的结果

int statusCode =response.getStatusLine().getStatusCode();

System.out.println(statusCode);

String content = EntityUtils.toString(response.getEntity(), "UTF-8");

System.out.println(content);

//关闭httpclient

response.close();

httpClient.close();

}

http异步请求

1.通过httpAsncClient实现

import org.apache.http.HttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.concurrent.FutureCallback;

import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;

import org.apache.http.impl.nio.client.HttpAsyncClients;

import org.apache.http.util.EntityUtils;

import java.io.IOException;

import java.util.concurrent.CountDownLatch;

public class Main {

public static void main(String[] argv) {

CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();

httpclient.start();

final CountDownLatch latch = new CountDownLatch(1);

final HttpGet request = new HttpGet("https://www.alipay.com/");

System.out.println(" caller thread id is : " + Thread.currentThread().getId());

httpclient.execute(request, new FutureCallback() {

@Override

public void completed(final HttpResponse response) {

latch.countDown();

System.out.println(" callback thread id is : " + Thread.currentThread().getId());

System.out.println(request.getRequestLine() + "->" + response.getStatusLine());

try {

String content = EntityUtils.toString(response.getEntity(), "UTF-8");

System.out.println(" response content is : " + content);

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void failed(final Exception ex) {

latch.countDown();

System.out.println(request.getRequestLine() + "->" + ex);

System.out.println(" callback thread id is : " + Thread.currentThread().getId());

}

@Override

public void cancelled() {

latch.countDown();

System.out.println(request.getRequestLine() + " cancelled");

System.out.println(" callback thread id is : " + Thread.currentThread().getId());

}

});

try {

latch.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

try {

httpclient.close();

} catch (IOException ignore) {

}

}

}

2.还是通过同步请求,但是另起一个线程来计时,这种本质上有一个线程始终在堵塞,等待web端资源的返回。

HttpClient包中,三个设置超时的地方:

/* 从连接池中取连接的超时时间*/

ConnManagerParams.setTimeout(params, 1000);

/*连接超时*/

HttpConnectionParams.setConnectionTimeout(params, 2000);

/*请求超时*/

HttpConnectionParams.setSoTimeout(params, 4000);

ConnectionPoolTimeout:

定义了从ConnectionManager管理的连接池中取出连接的超时时间。

出错会抛出ConnectionPoolTimeoutException

ConnectionTimeout:

定义了通过网络与server建立连接的超时时间,Httpclient包中通过一个异步线程去创建与server的socket连接,这就是该socket连接的超时时间。

当连接HTTPserver或者等待HttpConnectionManager管理的一个有效连接超时出错会抛出ConnectionTimeoutException

SocketTimeout:

这定义了Socket读数据的超时时间,即从server获取响应数据须要等待的时间。

当读取或者接收Socket超时会抛出SocketTimeoutException

httpClient 请求头设置:

Accept、Connection、User-Agent

Accept:表示浏览器可以接收到的类型

*/*:表示所有类型

Connection:分为两种串行连接、持久连接(keep-alive)、管道化持久连接

1.串行连接中,每次交互都要打开关闭连接

2.持久连接中,第一次交互会打开连接,交互结束后连接并不关闭,下次交互就省去了建立连接的过程。

3.管道化持久连接,允许在持久连接的基础上,可选的使用传输管道,消除传输时延。

User-Agent:用户

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值