UFT中VBScript发送GET请求遇400错误:如何生成动态Timestamp或获取请求头
解决UFT(VBScript)中动态生成HTTP请求Timestamp的问题
首先,你遇到的核心问题是需要在VBScript中生成和Postman前置脚本pm.environment.set("hmacCreationTime", new Date().getTime());等价的动态时间戳——也就是当前时间距离1970年1月1日00:00:00的毫秒数。另外你提到用getAllResponseHeaders拿不到timestamp,是因为这个方法获取的是服务器返回的响应头,而timestamp是你需要主动发送的请求头,所以不需要从响应里读取,而是要自己生成后添加到请求中。
1. 在VBScript中生成动态毫秒级时间戳
Postman里的new Date().getTime()返回的是毫秒级的Unix时间戳,VBScript没有直接的方法,但可以通过计算当前时间与Unix纪元(1970-01-01 00:00:00)的时间差来实现。以下是实现函数:
Function GetUnixTimestampMs() Dim epoch, currentTime, timeDiff ' 定义Unix纪元时间(UTC) epoch = DateAdd("s", 0, "01/01/1970 00:00:00") ' 获取当前UTC时间 currentTime = Now() ' 计算时间差(毫秒) timeDiff = DateDiff("s", epoch, currentTime) * 1000 ' 加上当前时间的毫秒部分 timeDiff = timeDiff + (Timer() - Int(Timer())) * 1000 ' 取整得到最终的毫秒时间戳 GetUnixTimestampMs = CInt(timeDiff) End Function
2. 修改你的UFT脚本,使用动态时间戳
把你硬编码的timestamp请求头替换成上面函数生成的值,修改后的完整代码如下:
strWebServiceURL = "https://demo.com/customer/account/v1/auth/getauthtoken" Set oWinHttp = CreateObject("WinHttp.WinHttpRequest.5.1") oWinHttp.SetTimeouts 0, 360000, 360000, 360000 'Open a HTTP connection to a HTTP resource oWinHttp.Open "GET", strWebServiceURL, False ' 生成动态毫秒级时间戳并设置请求头 Dim dynamicTimestamp dynamicTimestamp = GetUnixTimestampMs() oWinHttp.SetRequestHeader "timestamp", CStr(dynamicTimestamp) oWinHttp.SetRequestHeader "clientId","clientId" oWinHttp.SetRequestHeader "User-Agent","neoload" 'Send a HTTP request to the HTTP server with the header and body info oWinHttp.Send oWinHttp.WaitForResponse 'Get response getRestRequest = oWinHttp.ResponseText Set oWinHttp = Nothing ' 时间戳生成函数 Function GetUnixTimestampMs() Dim epoch, currentTime, timeDiff epoch = DateAdd("s", 0, "01/01/1970 00:00:00") currentTime = Now() timeDiff = DateDiff("s", epoch, currentTime) * 1000 timeDiff = timeDiff + (Timer() - Int(Timer())) * 1000 GetUnixTimestampMs = CInt(timeDiff) End Function
3. 额外注意事项
- 确保你的本地时间与服务器时间同步:很多接口的timestamp验证会要求时间差在一定范围内(比如5分钟),如果本地时间偏差太大,可能会导致验证失败。
- 如果接口要求的是UTC时间,上面的函数已经使用了UTC时间计算,无需额外调整;如果要求的是本地时间,可根据时区偏移调整
currentTime的取值。
内容的提问来源于stack exchange,提问作者gokul9677
相关产品推荐
相关产品推荐

