You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用WebMock存根请求并返回含正则匹配ID的响应?

WebMock存根请求时处理动态数字ID的解决方案

你原来的代码无法运行的核心原因是:JSON不支持序列化正则表达式对象。当你调用{ "data": [{ "id": /\d+/ }] }.to_json时,Ruby会把正则转换成字符串"/\\d+/",WebMock返回的响应体里会是这个字符串,而不是能匹配任意数字的逻辑——这显然不符合你的需求。

根据你的需求(生成唯一ID且无需手动枚举数字组合),以下是两种可行的解决方案:

场景1:匹配任意带数字ID的请求

如果你的需求是让存根匹配URL中包含任意数字ID的请求(比如someurl/123、someurl/4567这类),可以直接用正则匹配请求URL:

# 匹配someurl后接任意数字的URL
stub_request(:get, /someurl\/\d+/).
  with(headers: {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
  to_return(status: 200, body: { "data": [{ "id": SecureRandom.random_number(1_000_000) }] }.to_json)

这里用SecureRandom.random_number生成随机数字作为响应的ID,保证每次返回的ID唯一。

场景2:动态生成唯一响应ID

如果你的需求是每次请求存根时,返回一个唯一的数字ID(不管请求内容是什么),可以用WebMock的块式返回逻辑,动态生成ID:

方式1:递增序列ID(保证连续唯一)

id_counter = 0
stub_request(:get, "someurl").
  with(headers: {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
  to_return(status: 200) do |request|
    id_counter += 1
    { body: { "data": [{ "id": id_counter }] }.to_json }
end

每次调用存根,ID会自动递增,确保绝对唯一。

方式2:随机唯一数字ID

stub_request(:get, "someurl").
  with(headers: {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
  to_return(status: 200) do |request|
    # 生成一个大的随机唯一数字
    unique_id = SecureRandom.uuid.delete('-').to_i(16)
    { body: { "data": [{ "id": unique_id }] }.to_json }
end

利用UUID生成唯一字符串,再转换为数字,适合不需要连续ID的场景。

内容的提问来源于stack exchange,提问作者Tony Beninate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:41:18