一次项目线上问题定位 ,发现多次不同参数请求值相同 ,直接上代码
List<String> list = new ArrayList<>();
list.add("85657218,上海奉贤恒盛湖畔豪庭xxx号xxx");
list.add("85657219,上海虹口虬江支路xxx弄xxx室");
if (CollectionUtil.isNotEmpty(list)) {
HttpRequest get = HttpUtil.createGet("https://restapi.amap.com/v3/geocode/geo");
list.forEach(address -> {
String[] idAndaddress = address.split(",");
get.form("address", idAndaddress[1]);
get.form("key", "key");
get.form("s", "rsv3");
HttpResponse execute = get.execute();
JSONObject jsonObject = JSONUtil.parseObj(execute.body());
if ("OK".equals(jsonObject.getStr("info")) && "1".equals(jsonObject.getStr("status"))) {
String locatioin = (String) jsonObject.getByPath("geocodes[0].location");
String[] lngAndlat = locatioin.split(",");
log.info("更新地址 :{} , {} , {}", Convert.toInt(idAndaddress[0]), lngAndlat[0], lngAndlat[1]);
} else {
log.info("需求坐标补偿调用高德异常:{}", jsonObject.getStr("info"));
}
});
}
在这段代码中,list有两条不同地址的数据,需要依次请求高德拿到地址对应的经纬度,然而通过log.info打印发现两次不同的地址拿到的经纬度都是第一个地址的经纬度
于是开启debug之路,依次进入对应方法
get.execute() → doExecute() → urlWithParamIfGet()
private HttpResponse doExecute(boolean isAsync, HttpInterceptor.Chain interceptors) {
if (null != interceptors) {
for (HttpInterceptor interceptor : interceptors) {
interceptor.process(this);
}
}
// 初始化URL
urlWithParamIfGet();
// 初始化 connection
initConnection();
// 发送请求
send();
// 手动实现重定向
HttpResponse httpResponse = sendRedirectIfPossible(isAsync);
// 获取响应
if (null == httpResponse) {
httpResponse = new HttpResponse(this.httpConnection, this.charset, isAsync, isIgnoreResponseBody());
}
return httpResponse;
}
private void urlWithParamIfGet() {
if (Method.GET.equals(method) && false == this.isRest) {
// 优先使用body形式的参数,不存在使用form
if (ArrayUtil.isNotEmpty(this.bodyBytes)) {
this.url.getQuery().parse(StrUtil.str(this.bodyBytes, this.charset), this.charset);
} else {
this.url.getQuery().addAll(this.form);
}
}
}
在urlWithParamIfGet方法初始化URL时会给表单的参数添加到路径的query中,可以看到表单参数的时候是给当前的表单参数叠加到当前请求对象的url的query中
第一次请求的参数
第二次请求的参数,长度是6 ,因为是公用一个request请求对象,所以给第二次请求的参数追加进第一次请求的地址里了
这里可以看到第二次请求参数处理完发现 请求地址的query的长度是6,第二次的参数跟在第一次参数的后面,而不会清除旧的数据。这样会导致请求 URL 中的表单数据不断叠加,从而使每次请求发送的实际表单数据都是相同的,这也就导致了相同的请求结果
![在这里插入图片描述](/i/ll/?i=direct/6b14902d49754745869ee06d5501347b.png
如何解决这个不同参数请求结果相同呢,给请求对象从循环外面拿到里面即可,每次都会创建一个新的url的query添加form参数
调整后代码:
List<String> list = new ArrayList<>();
list.add("85657218,上海奉贤恒盛湖畔豪庭xxx号xxx");
list.add("85657219,上海虹口虬江支路xxx弄xxx室");
if (CollectionUtil.isNotEmpty(list)) {
list.forEach(address -> {
HttpRequest get = HttpUtil.createGet("https://restapi.amap.com/v3/geocode/geo");
String[] idAndaddress = address.split(",");
get.form("address", idAndaddress[1]);
get.form("key", "key");
get.form("s", "rsv3");
HttpResponse execute = get.execute();
JSONObject jsonObject = JSONUtil.parseObj(execute.body());
if ("OK".equals(jsonObject.getStr("info")) && "1".equals(jsonObject.getStr("status"))) {
String locatioin = (String) jsonObject.getByPath("geocodes[0].location");
String[] lngAndlat = locatioin.split(",");
log.info("更新地址 :{} , {} , {}", Convert.toInt(idAndaddress[0]), lngAndlat[0], lngAndlat[1]);
} else {
log.info("需求坐标补偿调用高德异常:{}", jsonObject.getStr("info"));
}
});
}
标签:info,定位,请求,form,get,jsonObject,list,参数
From: https://blog.csdn.net/qq_41973632/article/details/139298828