Mock 语法
Apifox Mock 语法完全兼容 Faker.js 和 Mock.js,并且还扩展了一些常用语法(例如国内手机号 {{$phone.mobile}}
)。你可以在“项目设置 -> Mock 设置” 里选择引擎库,默认为 Faker.js
引擎库,也是我们推荐的。
Faker.js 语法
与原生的 Faker.js 不同,在 Apifox 中只需输入 {{$
即可触发自动补全,轻松浏览可用的Faker.js
方法,它们的对比如下:
- Faker.js:
faker.finance.accountName()
- Apifox:
{{$finance.accountName}}
基本写法
写法 | 说明 |
---|---|
以{{$ 起始的字符串 | 调用 Mock 语法规则生成对应的数据。 如生成的数据类型和定义的数据类型不一致,则会自动转换。 |
非{{$ 起始的字符串 | 数据类型为string 时,原样输出。其他数据类型,会将字符串自动转换到对应的数据类型。 |
特殊字符:null | 数据类型允许为null 时,输出null 。否则自动转换,如数据类型为 string ,输出"null" 。 |
特殊字符:true | 数据类型为boolean 时,输出true 。否则自动转换,如数据类型为 string ,输出"true"。 |
特殊字符:false | 数据类型为boolean 时,输出false 。否则自动转换,如数据类型为 string ,输出"false"。 |
基础匹配规则
数据类型 | 匹配方式 | 匹配规则 | 匹配大小写 | Mock 规则 | 备注 |
---|---|---|---|---|---|
string | 正则表达式 | avatar|icon | 否 | {{$image.avatar}} | 头像、icon |
string | 正则表达式 | image|img|photo|pic | 否 | {{$image.urlPlaceholder(width=400,height=400)}} | 图片 |
string | 通配符 | *url | 否 | {{$internet.url}} | URL |
string | 正则表达式 | nick|user_?name | 否 | {{$person.fullName}} | 用户名、昵称 |
string | 正则表达式 | title|name | 否 | {{$lorem.words}} | 标题、名称 |
string, integer, number | 正则表达式 | id|num|code|amount|quantity|price|discount|balance|money | 否 | {{$number.int(min=1,max=100)}} | 常见数字型 |
string | 正则表达式 | phone|mobile|tel$ | 否 | {{$phone.mobile}} | 手机号 |
string | 通配符 | *date | 否 | {{$date.anytime|format('yyyy-MM-dd')}} | 字符串日期 |
integer, number | 通配符 | *date | 否 | {{$date.anytime|format('yyyyMMdd')}} | 数字型日期 |
string | 正则表达式 | created??at|updated??at|deleted?_?at|.*time | 否 | {{$date.anytime}} | 字符串时间 |
integer, number | 正则表达式 | created??at|updated??at|deleted?_?at|.*time | 否 | {{$date.anytime|format('T')}} | 时间戳 |
string | 正则表达式 | e?mail* | 否 | {{$internet.email(provider='qq.com')}} | 邮箱 |
string | 通配符 | province | 否 | {{$location.state}} | 省份 |
string | 通配符 | city | 否 | {{$location.city}} | 城市 |
string | 通配符 | *address | 否 | {{$location.state}}{{$location.city}}{{$location.county}} | 地址 |
string | 通配符 | *district | 否 | {{$location.county}} | 区 |
string | 通配符 | *ip | 否 | {{$internet.ipv4}} | IP 地址 |
string | 通配符 | birthday | 否 | {{$date.anytime|format('yyyy-MM-dd')}} | 字符串出生日期 |
integer, number | 通配符 | birthday | 否 | {{$date.anytime|format('yyyyMMdd')}} | 数字型出生日期 |
string | 正则表达式 | gender|sex | 否 | {{$person.sex}} | 中文性别 |
string | 通配符 | description | 否 | {{$lorem.sentences}} | 中文描述 |
integer, number | 通配符 | * | 否 | {{$number.int(min=1,max=100)}} | 通用数字类型 |
string | 完全匹配 | base64 | 是 | {{$string.sample|base64}} | 字节格式 |
自动转换 是使用 javascript 语言默认数据转换方法进行转换。
进阶示例
可参考“动态值表达式”模块查看更多示例。
Mock.js 语法
基本写法
写法 | 说明 |
---|---|
以@ 起始的字符串 | 调用 Mock 语法规则生成对应的数据。 如生成的数据类型和定义的数据类型不一致,则会自动转换。 |
非@ 起始的字符串 | 数据类型为string 时,原样输出。其他数据类型,会将字符串自动转换到对应的数据类型。 |
特殊字符:null | 数据类型允许为null 时,输出null 。否则自动转换,如数据类型为 string ,输出"null" 。 |
特殊字符:true | 数据类型为boolean 时,输出true 。否则自动转换,如数据类型为 string ,输出"true"。 |
特殊字符:false | 数据类型为boolean 时,输出false 。否则自动转换,如数据类型为 string ,输出"false"。 |
自动转换 是使用 javascript 语言默认数据转换方法进行转换。
基础匹配规则
分类 | 规则 | 示例 | 示例结果 |
---|---|---|---|
布尔值 | @boolean | @boolean | false true true |
@boolean( min, max, current ) | @boolean(1, 9, true) | false false | |
自然数 | @natural | @natural | 5748399088025322 3295768519606992 6595528165924058 |
@natural( min ) | @natural(10000) | 5492366038361662 2061541478134547 | |
@natural( min, max ) | @natural(60, 100) | 99 66 | |
整数 | @integer | @integer | -7585865973372456 3913822053899244 5164580957595932 |
@integer( min ) | @integer(10000) | 7304069372231661 6538343333105173 | |
@integer( min, max ) | @integer(60, 100) | 99 66 | |
浮点数 | @float | @float | 4791951330736181 3310225074798816.5 -2562681950443352.5 |
@float( min ) | @float(0) | 460523639430244.3 5146972509822378 | |
@float( min, max ) | @float(60, 100) | 91.85250094787806 66.1232254588188 | |
@float( min, max, dmin ) | @float(60, 100, 3) | 66.4375611 78.50157676437885 | |
@float( min, max, dmin, dmax ) | @float(60, 100, 3, 5) | 91.5811 91.27216 | |
单字符 | @character | "z" "%" "V" | |
@character( pool ) | @character('lower') | "x" | |
@character('upper') | "R" | ||
@character('number') | "6" | ||
@character('symbol') | "#" | ||
@character( pool ) | @character('aeiou') | "i" "o" | |
字符串 | @string | @string | "2u&x" "rUlmf" "5qfJp1" |
@string( length ) | @string(5) | "88yC6" "3^8VT" | |
@string( pool, length ) | @string('lower', 5) | "xlmes" | |
@string('upper', 5) | "SETVW" | ||
@string('number', 5) | "12751" | ||
@string('symbol', 5) | "%&(#*" | ||
@string('aeiou', 5) | "eeaeu" | ||
@string( min, max ) | @string(7, 10) | "ZIuenM8" "DVu%]kEqC" | |
@string( pool, min, max ) | @string('lower', 1, 3) | "m" | |
@string('upper', 1, 3) | "XXA" | ||
@string('number', 1, 3) | "8" | ||
@string('symbol', 1, 3) | "[" | ||
@string('aeiou', 1, 3) | "a" |
正则表达式
规则 | 示例 | 示例结果 |
---|---|---|
@regexp( regexp ) | @regexp(/\d+/) | "36436" |
@regexp(/\d{3,5}/) | "343" | |
@regexp(/^[a-zA-Z][A-Za-z0-9_\-\.]+@gmail.com$/) | "ifa3dt@gmail.com" |
注意
- regexp 参数必须以
/
起始和结尾。 - 点击查看正则表达式参考文档。
日期/时间
分类 | 规则 | 示例 | 示例结果 |
---|---|---|---|
日期 | @date | @date | "2013-09-05" |
@date( format ) | @date('yyyy-MM-dd') | "1992-10-27" | |
@date('yy-MM-dd') | "04-01-30" | ||
@date('y-MM-dd') | "90-07-29" | ||
@date('y-M-d') | "71-6-4" | ||
@date('yyyy yy y MM M dd d') | "1971 71 71 05 5 02 2" | ||
时间 | @datetime | @datetime | "1988-05-25 11:34:14" |
@datetime( format ) | @datetime('yyyy-MM-dd A HH:mm:ss') | "1978-01-10 AM 03:59:54" | |
@datetime('yy-MM-dd a HH:mm:ss') | "92-06-22 pm 12:45:54" | ||
@datetime('y-MM-dd HH:mm:ss') | "97-02-10 06:01:13" | ||
@datetime('y-M-d H: m:s') | "98-10-17 18:56:12" | ||
当前时间 | @now | @now | |
@now( unit ) | @now('year') | "2020-01-01 00:00:00" | |
@now('month') | "2020-08-01 00:00:00" | ||
@now('week') | "2020-08-09 00:00:00" | ||
@now('day') | "2020-08-11 00:00:00" | ||
@now('hour') | "2020-08-11 15:00:00" | ||
@now('minute') | "2020-08-11 15:24:00" | ||
@now('second') | "2020-08-11 15:24:02" | ||
@now( format ) | @now('yyyy-MM-dd HH:mm:ss SS') | "2020-08-11 15:24:02 761" | |
@now( unit, format ) | @now('day', 'yyyy-MM-dd HH:mm:ss SS') | "2020-08-11 00:00:00 000" | |
时间戳 | @timestamp( format ) | @timestamp('s') | "1662605353" |
@timestamp('ms') | "1662605408838" |
图片
分类 | 规则 | 示例 | 示例结果 |
---|---|---|---|
图片 URL | @image | @image | "http://dummyimage.com/300x250" |
@image( size ) | @image('200x100') | "http://dummyimage.com/200x100" | |
@image( size, background ) | @image('200x100', '#FF6600') | "http://dummyimage.com/200x100/FF6600" | |
@image( size, background, text ) | @image('200x100', '#4A7BF7', 'Hello') | "http://dummyimage.com/200x100/4A7BF7&text=Hello" | |
@image( size, background, foreground, text ) | @image('200x100', '#50B347', '#FFF', 'Mock.js') | "http://dummyimage.com/200x100/50B347/FFF&text=Mock.js" | |
@image( size, background, foreground, format, text ) | @image('200x100', '#894FC4', '#FFF', 'png', '!') | "http://dummyimage.com/200x100/894FC4/FFF.png&text=!" | |
图片数据 | @dataImage | @dataImage | |
@dataImage( size ) | @dataImage('200x100') | ||
@dataImage( size, text ) | @dataImage('200x100', 'Hello Mock.js!') |
颜色
规则 | 示例 | 示例结果 |
---|---|---|
@color | @color | "#79aaf2" |
@hex | @hex | "#79f2d0" |
@rgb | @rgb | "rgb(121, 210, 242)" |
@rgba | @rgba | "rgba(121, 242, 167, 0.50)" |
@hsl | @hsl | "hsl(228, 82, 71)" |
中文文本
分类 | 规则 | 示例 | 示例结果 |
---|---|---|---|
段落 | @cparagraph | @cparagraph | "量值这专平约称结半米化目管结北问。次便为流据由经改候究历学始影增具完。流极什其转青次各红团地真产观。争置着安眼头近效例温持完始音加照族。向素海究果存处划化复阶商手。心便近型无院些其认性几步性。" |
@cparagraph( len ) | @cparagraph(2) | "表验目给有新状段步表她位决华响。心什采最结小务受装通米知度是效近。" | |
@cparagraph( min, max ) | @cparagraph(1, 3) | "东例例候专干类济带史还二任头。他千统南常公历快几要只证按规提合中。边也心近号其变代白飞小总红易。" | |
句子 | @csentence | @csentence | "会己风感本员主见它真划生史派达原。" |
@csentence( len ) | @csentence(5) | "化而知只可。" | |
@csentence( min, max ) | @csentence(3, 5) | "称育满。" | |
单词 | @cword | @cword | "光" |
@cword( pool ) | @cword('零一二三四五六七八九十') | "三" | |
@cword( len ) | @cword(5) | "目法小" | |
@cword( pool, length ) | @cword('零一二三四五六七八九十', 3) | "十一九" | |
@cword( min, max ) | @cword(3, 5) | "除文更代" | |
标题 | @ctitle | @ctitle | "清照过做问" |
@ctitle( len ) | @ctitle(5) | "系做组平想" | |
@ctitle( min, max ) | @ctitle(3, 5) | "热群越半" |
中文姓名
规则 | 示例 | 示例结果 |
---|---|---|
@cfirst | @cfirst | "赵" |
@clast | @clast | "秀英" |
@cname | @cname | "乔强" |
Web 相关
规则 | 示例 | 示例结果 |
---|---|---|
"s.piqapshn@qiepsdrrm.jm" | ||
@ip | @ip | "99.34.19.184" |
@url | @url | "gopher://yux.ad/sxte" |
@url( protocol ) | @url('http') | "http://psrvbes.mobi/cxyvc" |
@domain | @domain | "hrwt.pt" |
@domain( tld ) | @domain('com') | "fdsfl.com" |
@protocol | @protocol | "ftp" |
@tld | @tld | "ga" |
地址相关
分类 | 规则 | 示例 | 示例结果 |
---|---|---|---|
区域 | @region | @region | "华北" |
省 | @province | @province | "陕西省" |
市 | @city | @city | "淮北市" |
市 (含省) | @city( prefix ) | @city(true) | "广东省 肇庆市" |
区 | @county | @county | "东昌区" |
区 (含省市) | @county( prefix ) | @county(true) | "湖南省 怀化市 溆浦县" |
邮编 | @zip | @zip | "843028" |
其他
分类 | 规则 | 示例 | 示例结果 |
---|---|---|---|
GUID | @guid | @guid | "D3f4c7A7-6c6B-1BEA-ff1b-DBfde6Bc1E17" |
数字 ID | @id | @id | "450000197209231877" |
自增 ID | @increment | @increment | "1" "2" "3" |
@increment( step ) | @increment(100) | "101" "201" "301" | |
首字母大写 | @capitalize( word ) | @capitalize('hello') | "Hello" |
全大写 | @upper( str ) | @upper('hello') | "HELLO" |
全小写 | @lower( str ) | @lower('HELLO') | "hello" |
多选一 | @pick( arr ) | @pick(["a", "e", "i", "o", "u"]) | "e" |
乱序 | @shuffle( arr ) | @shuffle(["a", "e", "i", "o", "u"]) | ["e","i","o","a","u"] |
英文文本
分类 | 规则 | 示例 | 示例结果 |
---|---|---|---|
段落 | @paragraph | @paragraph | "Befq rkjnyqbc wrflqkzjly tlcdmjm rqpnup ipa fwxkipy bcew nbbnjfrc phroqxn fdhbqdbb cfoute icvcesoar qaetf. Rzurmrdgp wxktybadq byob oqspsewp ljxdrmhnu dwrrqyt mjwqxvrj crd nqcl hudow fokknwhqx aylfpdibdr. Qjwddj seudwxsw bugqajbik johcd bbdslyb natgh vwhbem evayqr csr ftol bjduobs cfiqy uujjldmdgo bsqq. Pttt kdwvhclmn wycb jylskicq jfleydoug gtvlqibx rekmy hmqssqiij fdsmfcs sqmktug cxqun qpecltkv dpdpiqejt lnk." |
@paragraph( len ) | @paragraph(2) | "Qjcneih hxqtyeyhx crdori puxzq sukv mmoix gyoecfk nqwmvqlg ltvsdpshy qremm awlbgtskx qqzun wppoiasprw ldvlhgh wcyv odotfnggm bgqgcrpwu. Cjyohmm vyrj ehtnlgbg opj budsggflof nilo hlxp wwatulc hunwohq gglluimn mqht audi aepicfkv etpdld pmfuo iotsdbladi shvxfes." | |
@paragraph( min, max ) | @paragraph(1, 3) | "Mgoyprc hmnscp mrhggsufd jxjpo ggbnxddtqv epdii reuwqs dtyfjmc ppq igcji muudseokx uigz oivhmvbdu csgjfslwc yhu. Mjvln pydscchcrx nnel nxmw edyi ybt kuffpq sjdocykn pxlzem jrjlm pmvck culvj xecywqm oovofkqfwu." | |
句子 | @sentence | @sentence | "Kgjo tomuhfu phqjx dhmclyl gyyrqpk hgzzrer vjlo cqcr pvkwsogqf ejngmhyuk nsod ouldhpu llkpctcnxs ubzkfu uepyxbkx kopy sdsw." |
@sentence( len ) | @sentence(5) | "Ktlison axxvc fphbrrn txzoj jupzyrnl." | |
@sentence( min, max ) | @sentence(3, 5) | "Jzlop lqmkuu cjnrkhge xofrywpe." | |
单词 | @word | @word | "fers" |
@word( len ) | @word(5) | "qtpjf" | |
@word( min, max ) | @word(3, 5) | "payxj" | |
标题 | @title | @title | "Rvugsxd Jytpw Gqrcffglc Qjt" |
@title( len ) | @title(5) | "Fwbh Udrrncbdpo Xwdqhpu Zvlxyn Fvfnu" | |
@title( min, max ) | @title(3, 5) | "Kwnim Ekvocyml Onxnh" |
英文姓名
规则 | 示例 | 示例结果 | 说明 |
---|---|---|---|
@first | @first | "Michelle" | |
@last | @last | "Lewis" | |
@name | @name | "Charles Williams" |
Mock 拼接
你可以在定义响应示例时拼接多条 Mock,以生成更丰富的数据。
假设现在需要在某一项字段中输出多个随机数据,例如预期返回某个街道与门牌号,那么可以在数据结构新增 Address
字符串并填入以下 Mock 语法: @cword()@cword()@pick(['街','路'])@integer(1,100)号
。
提示
拼接多个 Mock 语法时需在结尾处添加 ()
字符。
运行接口后得到以下返回响应:
同理,当预期返回带省市的街道地址,则输入 @county(true)@cword()@cword()@pick(['街','路']) @integer(1,100) 号
。