如果一个get请求的响应报文很大,响应时间和读取时间很长,使用hutool的HttpUtil.get(url)方法如何优化
时间: 2024-02-17 09:04:11 浏览: 179
如果一个GET请求的响应报文很大,响应时间和读取时间很长,可以使用Hutool的HttpUtil.getStream方法进行优化,该方法返回InputStream类型的响应结果,可以边读取边处理,避免一次性加载整个响应报文导致内存溢出。具体示例如下:
```
InputStream inputStream = HttpUtil.getStream(url);
// 逐行读取响应报文
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
// 处理每一行响应报文
}
```
另外,还可以通过设置连接和读取超时时间来缩短等待响应的时间,如:
```
HttpUtil.setTimeout(5000); // 设置超时时间为5秒
String result = HttpUtil.get(url); // 发送GET请求
```
这样可以在一定程度上缩短等待响应的时间。
相关问题
String sign =""; if( null != map.get("sign")){ sign = map.get("sign"); } log.info("买气退款回调参数"+map.toString()); String isRepeat = stringRedisTemplate.opsForValue().get((refundOrderNo+"repeat")); if(null == isRepeat || isRepeat.length() <= 0){ log.info("支付结束"); return null; }else{ stringRedisTemplate.delete((refundOrderNo+"repeat")); } Map<String,String> codeMap = MapUtil.newHashMap(); codeMap.put("serialNumber",outTradeNo); List<H5UserPayCode> list = h5UserPayCodeServiceImpl.byList(codeMap); H5UserPayCode payCode = list.get(0); payCode.setIsRefund(1); payCode.setRefundTime(LocalDateTime.now()); payCode.setRefundCode(refundOrderNo); if(h5UserPayCodeServiceImpl.updateById(payCode)) { stringRedisTemplate.delete(refundOrderNo); log.info("开始往稠州银行写数据-退款数据"); String tempUrl = platformConfig.getPayCzcb().getBaseUrl() + "gasbusiness/v2/orderRefund"; CzcbSFTRefundVO czcbSFTRefundVO = new CzcbSFTRefundVO(); czcbSFTRefundVO.setChannel_no(platformConfig.getPayCzcb().getChannelNo()); czcbSFTRefundVO.setApp_no(platformConfig.getPayCzcb().getAppNo()); String serialNo = SerialNoUtil.genSerialNo("OAC"); czcbSFTRefundVO.setSerial_no(serialNo); czcbSFTRefundVO.setOrder_no(payCode.getOrderCode()); // czcbSFTPayVO.setOrder_type("A"); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); czcbSFTRefundVO.setRefund_time(dtf.format(payCode.getCreateTime())); czcbSFTRefundVO.setRefund_amount(new BigDecimal(payCode.getAmount()+"")); czcbSFTRefundVO.setOut_trade_no(payCode.getSerialNumber()); czcbSFTRefundVO.setOut_refund_no(refundOrderNo); czcbSFTRefundVO.setTrans_amount_1(BigDecimal.ZERO); czcbSFTRefundVO.setTrans_amount_2(BigDecimal.ZERO); czcbSFTRefundVO.setTrans_amount_3(new BigDecimal(payCode.getAmount()+"")); czcbSFTRefundVO.setRemark("盛付通订单支付退款"); //判断是正式还是测试 if ( SpringContextUtil.isProd() ) { czcbSFTRefundVO.setOpp_account_no("1010220406000001"); // czcbSFTRefundVO.setOpp_account_no("1010220214000003"); }else{ czcbSFTRefundVO.setOpp_account_no("1010220214000003"); } czcbSFTRefundVO.setOpp_account_name("义乌市城建燃气经营有限公司"); czcbSFTRefundVO.setTrans_amount_4(BigDecimal.ZERO); czcbSFTRefundVO.setTrans_amount_5(new BigDecimal(payCode.getAmount()+"")); czcbSFTRefundVO.setTrans_amount_6(BigDecimal.ZERO); // 操作日期 czcbSFTRefundVO.setTrans_date(DateTime.now().toString("yyyy-MM-dd")); // 操作时间 czcbSFTRefundVO.setTrans_tradetime(DateTime.now().toString("yyyy-MM-dd HH:mm:ss")); czcbSFTRefundVO.setSign_data(SignUtil.addSignMD5(BeanUtil.beanToMap(czcbSFTRefundVO), platformConfig.getPayCzcb().getKey())); log.info("开始往稠州银行写数据:" + JSON.toJSONString(czcbSFTRefundVO)); String result = HttpUtil.post(tempUrl, JSON.toJSONString(czcbSFTRefundVO)); log.info("开始往稠州银行写数据:" + result); if(isSuccess(result)){ log.info("开始往稠州银行写数据写入成功"); } } }catch(Exception ex){ ex.printStackTrace(); } return new R(200,"回调成功"); }
这是一段使用 Java 编写的代码。它的作用是执行退款操作,并将退款的相关信息写入稠州银行的系统。
具体来说,首先检查传入的参数中是否包含 "sign" 字段,如果包含就将其赋值给变量 "sign"。然后记录一条日志,内容为传入参数的内容。接下来,在 Redis 中检查是否存在与退款订单号对应的值,如果不存在或值为空,就直接返回 null。否则,就将 Redis 中的对应的值删除。
然后,使用传入的流水号从数据库中查询相关的记录,并将记录的退款状态更新为已退款。之后使用更新后的记录更新数据库中的相应记录,并在操作成功后将 Redis 中与退款订单号对应的值删除。
最后,使用从配置文件中读取的稠州银行的 URL 和相关参数,调用稠州银行的退款接口,并将相关信息写入稠州银行的系统中。
httpurlconnection get请求添加参数
通过HTTPURLConnection发送GET请求添加参数的方法如下:
1. 创建URL对象,将目标网址作为参数传入URL构造函数中。
2. 调用URL对象的openConnection()方法获取连接对象HttpURLConnection。
3. 设置连接超时时间和读取超时时间,可以使用connection.setConnectTimeout(timeout)和connection.setReadTimeout(timeout)方法设置。
4. 设置请求方式为GET,使用connection.setRequestMethod("GET")方法设置。
5. 添加参数到URL中,可以通过在URL后面添加参数的方式实现。例如,如果参数是"username=lilp21&password=pass1234",则可以使用String的拼接方式将参数添加到URL中。
6. 调用connection.connect()方法建立连接。
7. 获取输入流,使用connection.getInputStream()方法获取。
8. 使用BufferedReader逐行读取输入流中的数据,将数据存储到StringBuffer中。
9. 关闭输入流和连接,使用reader.close()和connection.disconnect()方法关闭。
10. 返回获取到的数据。
中提到的方法是通过创建一个URL对象,并使用openConnection()方法获得HttpURLConnection对象。然后设置连接超时时间和读取超时时间,使用setConnectTimeout()和setReadTimeout()方法设置。接下来设置请求方式为GET,使用setRequestMethod("GET")方法。最后使用connect()方法建立连接,并获取输入流以及进行后续的操作。
中的方法是通过调用doGet()方法来发送GET请求并获取返回结果。在方法内部的URL对象和HttpURLConnection对象的创建和连接设置与上述步骤相同。
中的代码片段是一个实际的示例,通过创建HashMap对象,将参数以键值对的形式放入HashMap中。然后使用JSONObject将HashMap转换为JSON格式的字符串。接着使用URLEncoder对JSON字符串进行编码,并将编码后的字符串添加到URL中。最后使用HttpUtil.doInnerGet()方法发送GET请求,并获取返回结果。
综上所述,通过创建URL对象,设置连接超时时间、读取超时时间和请求方式为GET,添加参数到URL中,并发送GET请求可以实现在HTTPURLConnection中添加参数。
阅读全文