首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Postman内置动态参数和自定义的动态参数以及断言方式

  • 23-12-10 07:02
  • 3769
  • 13449
blog.csdn.net

一、问题:每次请求均需手动修改参数

解决方案:使用动态参数:内置动态参数/自定义动态参数,解决上述问题

二、Postman动态参数

1、内置动态参数,表现形式:{{$}}

2、常用的内置动态参数

   {{$timestamp}}  生成当前时间的时间戳。

   {{$randomInt}}  生成0-1000之间的随机数

   {{$guid}}           生成速记GUID字符串  

3、自定义动态参数

  1. //手动的获得时间戳
  2.   var times = Date.now();
  3. //设置为全局变量
  4.   pm.globals.set("times",times);
  5. 使用时直接使用{{变量名}},即:{{times}}

3.1.postman接口中设置自定义动态参数 

3.2.接口中引用自定义的动态参数(全局变量) 

三、动态参数的断言

1、内置动态参数:无法做断言

因为返回的类型不一样,断言结果会始终失败

2、自定义动态参数(全局变量):可正常断言

  1. //断言形式常见的有下面3种:
  2. pm.globals.get("times")
  3. globals["times"]
  4. globals.times

大家好,我是苏三,又跟大家见面了。

前言

在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间。

比如:2025-04-21、2025/04/21、2025年04月21日等等。

有些字段是String类型,有些是Date类型,有些是Long类型。

如果不同的数据类型,经常需要相互转换,如果处理不好,可能会出现很多意想不到的问题。

这篇文章跟大家一起聊聊日期处理的常见问题,和相关的解决方案,希望对你会有所帮助。

最近准备面试的小伙伴,可以看一下这个宝藏网站(Java突击队):www.susan.net.cn,里面:面试八股文、面试真题、项目实战、工作内推什么都有。

一、日期的坑

1.1 日期格式化陷阱

在文章的开头,先给大家列举一个非常经典的日期格式化问题:

java
代码解读
复制代码
// 旧代码片段(线程不安全的经典写法) public class OrderService {   private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");*     public void saveOrder(Order order) {         // 线程A和线程B同时进入该方法         String createTime = sdf.format(order.getCreateTime());          // 可能出现"2023-02-30 12:00:00"这种根本不存在的日期         orderDao.insert(createTime);**     } }

问题复现场景:

  1. 高并发秒杀场景下,10个线程同时处理订单。
  2. 每个线程获取到的order.getCreateTime()均为2023-02-28 23:59:59。
  3. 由于线程调度顺序问题,某个线程执行sdf.format()时。
  4. 内部Calendar实例已被其他线程修改为非法状态。
  5. 最终数据库中出现2023-02-30这类无效日期。

问题根源:SimpleDateFormat内部使用了共享的Calendar实例,多线程并发修改会导致数据污染。

1.2 时区转换

我们在处理日期的时候,还可能会遇到夏令时转换的问题:

scss
代码解读
复制代码
// 错误示范:简单加减8小时 public Date convertToBeijingTime(Date utcDate) {     Calendar cal = Calendar.getInstance();     cal.setTime(utcDate);     cal.add(Calendar.HOUR, 8); // 没考虑夏令时切换问题     return cal.getTime(); }

夏令时是一种在夏季期间将时间提前一小时的制度,旨在充分利用日光,病节约能源。

在一些国家和地区,夏令时的开始和结束时间是固定的。

而在一些国家和地区,可能会根据需要调整。

在编程中,我们经常需要处理夏令时转换的问题,以确保时间的正确性。

隐患分析:2024年10月27日北京时间凌晨2点会突然跳回1点,直接导致订单时间计算错误

二、优雅方案的进阶之路

2.1 线程安全重构

在Java8之前,一般是通过ThreadLocal解决多线程场景下,日期转换的问题。

例如下面这样:

typescript
代码解读
复制代码
// ThreadLocal封装方案(适用于JDK7及以下) public class SafeDateFormatter {     private static final ThreadLocal<DateFormat> THREAD_LOCAL = ThreadLocal.withInitial(() ->          new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")     );     public static String format(Date date) {         return THREAD_LOCAL.get().format(date);     } }

线程安全原理:

  1. 每个线程第一次调用format()方法时
  2. 会通过withInitial()初始化方法创建独立的DateFormat实例
  3. 后续该线程再次调用时直接复用已有实例
  4. 线程销毁时会自动清理ThreadLocal存储的实例

原理揭秘:通过ThreadLocal为每个线程分配独立DateFormat实例,彻底规避线程安全问题。

2.2 Java8时间API革命

在Java8之后,提供了LocalDateTime类对时间做转换,它是官方推荐的方案。

例如下面这样:

typescript
代码解读
复制代码
// 新时代写法(线程安全+表达式增强) public class ModernDateUtils {     public static String format(LocalDateTime dateTime) {         return dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));     }     public static LocalDateTime parse(String str) {         return LocalDateTime.parse(str, DateTimeFormatter.ISO_LOCAL_DATE_TIME);     } }

黑科技特性:

  • 288种预定义格式器
  • 支持ISO-8601/ZonedDateTime等国际化标准
  • 不可变对象天然线程安全

最近就业形势比较困难,为了感谢各位小伙伴对苏三一直以来的支持,我特地创建了一些工作内推群, 看看能不能帮助到大家。

你可以在群里发布招聘信息,也可以内推工作,也可以在群里投递简历找工作,也可以在群里交流面试或者工作的话题。

添加苏三的私人微信:li_su223,备注:掘金+所在城市,即可加入。

三、高阶场景解决方案

3.1 跨时区计算(跨国公司必备)

下面这个例子是基于时区计算营业时长:

arduino
代码解读
复制代码
// 正确示范:基于时区计算营业时长 public Duration calculateBusinessHours(ZonedDateTime start, ZonedDateTime end) {     // 显式指定时区避免歧义     ZonedDateTime shanghaiStart = start.withZoneSameInstant(ZoneId.of("Asia/Shanghai"));     ZonedDateTime newYorkEnd = end.withZoneSameInstant(ZoneId.of("America/New_York"));          // 自动处理夏令时切换     return Duration.between(shanghaiStart, newYorkEnd); }

底层原理:通过ZoneId维护完整的时区规则库(含历史变更数据),自动处理夏令时切换。

3.2 性能优化实战

日均亿级请求的处理方案:

typescript
代码解读
复制代码
// 预编译模式(性能提升300%) public class CachedDateFormatter {     private static final Map<String, DateTimeFormatter> CACHE = new ConcurrentHashMap<>();     public static DateTimeFormatter getFormatter(String pattern) {         return CACHE.computeIfAbsent(pattern, DateTimeFormatter::ofPattern);     } }

我们可以使用static final这种预编译模式,来提升日期转换的性能。

性能对比:

方案内存占用初始化耗时格式化速度
每次新建Formatter1.2GB2.3s1200 req/s
预编译缓存230MB0.8s5800 req/s

3.3 全局时区上下文+拦截器

为了方便统一解决时区问题,我们可以使用全局时区上下文+拦截器。

例如下面这样:

typescript
代码解读
复制代码
// 全局时区上下文传递 publicclass TimeZoneContext {     privatestaticfinal ThreadLocal<ZoneId> CONTEXT_HOLDER = new ThreadLocal<>();     public static void setTimeZone(ZoneId zoneId) {         CONTEXT_HOLDER.set(zoneId);     }     public static ZoneId getTimeZone() {         return CONTEXT_HOLDER.get();     } } // 在Spring Boot拦截器中设置时区 @Component publicclass TimeZoneInterceptor implements HandlerInterceptor {     @Override     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {         String timeZoneId = request.getHeader("X-Time-Zone");         TimeZoneContext.setTimeZone(ZoneId.of(timeZoneId));         returntrue;     } }

此外,还需要在请求接口的header中传递X-Time-Zone时区参数。

四、优雅设计的底层逻辑

4.1 不可变性原则

scss
代码解读
复制代码
// LocalDate的不可变设计 LocalDate date = LocalDate.now(); date.plusDays(1); // 返回新实例,原对象不变 System.out.println(date); // 输出当前日期,不受影响

4.2 函数式编程思维

less
代码解读
复制代码
// Stream API处理时间序列 List<Transaction> transactions =      list.stream()         .filter(t -> t.getTimestamp().isAfter(yesterday)) // 声明式过滤         .sorted(Comparator.comparing(Transaction::getTimestamp)) // 自然排序         .collect(Collectors.toList()); // 延迟执行

五、总结

下面总结一下日期处理的各种方案:

境界代码特征典型问题修复成本
初级大量使用String拼接格式混乱/解析异常高
进阶熟练运用JDK8新API时区处理不当中
高手预编译+缓存+防御性编程性能瓶颈低
大师结合领域模型设计时间类型业务逻辑漏洞极低

终极建议:在微服务架构中,建议建立统一的时间处理中间件,通过AOP拦截所有时间相关操作,彻底消除代码层面的时间处理差异。

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的50万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。

注:本文转载自blog.csdn.net的沫沫18S的文章"https://blog.csdn.net/weixin_37600187/article/details/128098040"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top