AsyncHttpClient解决get请求带有body的实现,目前有2种解决方案:
1.一个是ApacheHttpClient异步请求(这个在本次文章不做介绍,常用的是方案)
2.是AsyncHttpClient
2.1首先引入jar,async-http-client这个jar的版本可以用最新的,看项目情况,有可能会跟其他模块的jar产生冲突
<dependency>
<groupId>org.asynchttpclient</groupId>
<artifactId>async-http-client</artifactId>
<version>2.1.0-alpha6</version>
</dependency>
<dependency>
<groupId>net.tascalate</groupId>
<artifactId>net.tascalate.concurrent</artifactId>
<version>0.9.5</version>
</dependency>
2.2,代码:header中要加入"Content-Type":"application/json;charset=UTF-8",要不然body查询条件不生效。
/**
* 执行异步HTTP请求
*/
public void asyncRequest(Object obj) {
String jwtToken = "";
String url = "xxxxx/msg/";
AsyncHttpClient c = new DefaultAsyncHttpClient();
String str = JSON.toJSONString(obj);
Future<Response> f = c.prepareGet(url).setBody(str)
.addHeader("token",jwtToken)
.addHeader("Content-Type", MediaType.APPLICATION_JSON_UTF8_VALUE)
.execute(new AsyncCompletionHandler<Response>() {
@Override
public Response onCompleted(Response response) {
return response;
}
@Override
public void onThrowable(Throwable t) {
throw new RuntimeException("exception")
}
});
try {
long startTime = System.currentTimeMillis();
Response response;
while (true){
response = f.get();
if(response!=null){
break;
}else {
long endTime = System.currentTimeMillis();
// 大于8秒认为查询数据失败
if((endTime-startTime)/1000>8){
throw new RuntimeException("exception")
}
}
}
} catch (Exception e) {
log.error("数据异常");
}
}