RestScript Language:一种Restful接口数据请求描述语言

在日常开发中,前端经常需要和后端进行对接著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】,但由于前后端分离模式下,两端开发者常常本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。在信息同步上(或者说沟通上)存在一些问…

在日常开发中,前端经常需要和后端进行对接著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。,但由于前后端分离模式下,两端开发者常常【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】在信息同步上(或者说沟通上)存在一些问题【转载请注明来源】【版权所有】唐霜 www.tangshuang.net,导致对接出问题,比如后端调整数据结构之【原创内容,转载请注明出处】【作者:唐霜】后,没有及时通知前端,或者由于后端使用了著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net公用方法,导致修改了一处接口之后影响了另【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。外的接口,最终导致上线后前端报错,再比如【原创不易,请尊重版权】【版权所有,侵权必究】后端在一次需求中增加了一个信息,但为了他本文版权归作者所有,未经授权不得转载。【作者:唐霜】们自己方便,增加了附带了整个对象信息,导原创内容,盗版必究。【转载请注明来源】致接口撑大,多出很多前端不需要的字段,再著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net比如前端在提交数据时,直接把本地的某些对【转载请注明来源】转载请注明出处:www.tangshuang.net象信息提交上去,而有些信息后端是不需要的转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。,甚至如果传上去会对原来的数据进行覆盖,本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。最终导致线上数据被破坏。这些情况的出现,本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。都是因为前后端在基于接口通信时,由于双方本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】没有准确了解接口的每一个信息,而导致的。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。我把这个问题,归纳为“缺乏协议”问题。即【本文首发于唐霜的博客】【作者:唐霜】,由于前后端开发没有一个强有力的协议,导【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net致在接口的生产和使用上没有规范,在缺乏规【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。范的情况下,衍生出对生产环境造成破坏的极未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net端情况。

【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】

为了以最小的代价解决这个问题,我发布了R【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】estScript Language,一本文作者:唐霜,转载请注明出处。原创内容,盗版必究。门Restful接口数据请求描述语言,在【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】不对双方工作造成习惯破坏的情况下,通过对【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】数据进行描述,最大限度的控制前后端接口交【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。互的上行下行数据的准确性。

未经授权,禁止复制转载。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net

灵感与雏形【本文首发于唐霜的博客】

原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net

基于Restful的接口数据交互包含请求本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】方式、url、参数信息(headers)【未经授权禁止转载】【转载请注明来源】等,同时,无论前端,还是后端,对发送或接著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】收的数据的结构、值的形式等都有一些要求。【转载请注明来源】【原创不易,请尊重版权】一个接口的交互往往就包含这些东西了,因此转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。,我们的设计,也是围绕它们展开。

【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。

作为描述语言,不需要按照编程语言一样设计【未经授权禁止转载】【本文受版权保护】,而是专注于请求本身,例如我们常见的SQ本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】L就是类似的语言设计。但和SQL不同的是【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net,我们对计算的要求不高,需要专注于前端数【原创不易,请尊重版权】未经授权,禁止复制转载。据交互这个非常小的领域。在这个领域,gr【原创内容,转载请注明出处】【原创不易,请尊重版权】aphql是佼佼者,不过我并不喜欢gra【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。phql,因为它的定义太复杂,对于前后端【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】的接入成本都很大,因为它相当于要后端打破【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】原来的restful的设计,改用一种新的【本文受版权保护】【作者:唐霜】规范来写接口,从数据库查询到把数据输出到【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】前端,给后端开发者带来的心智负担实在太重【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。了。除了官方提供的graphql工具,没著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】有足够的生态支持在已经成熟的后端生态圈长【本文受版权保护】【版权所有】唐霜 www.tangshuang.net期维护api接口。当然,这并不否定gra【转载请注明来源】著作权归作者所有,禁止商业用途转载。phql的出色,只是成本比较大。

【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【转载请注明来源】著作权归作者所有,禁止商业用途转载。

有没有一种比graphql简单,又不需要【转载请注明来源】【转载请注明来源】什么心智负担的模式,创建一种可以提供类似【未经授权禁止转载】原创内容,盗版必究。graphql的能力的语言呢?受grap转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】hql的启发,我们想要定义一种基于结构描【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】述的描述语言,如下:

本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【转载请注明来源】转载请注明出处:www.tangshuang.net

【本文首发于唐霜的博客】【原创内容,转载请注明出处】【原创内容,转载请注明出处】【未经授权禁止转载】未经授权,禁止复制转载。

通过对restful api的响应体的结【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。构描述,获得对应的数据。我称这种对应为“本文作者:唐霜,转载请注明出处。原创内容,盗版必究。数据剪裁”,也就是从完整的api接口中,著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】只获得自己需要的对应字段的信息。这对前端【版权所有,侵权必究】【本文首发于唐霜的博客】来讲有的时候非常有用。

著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net

于是,我们有了第一个部分语法雏形:【版权所有】唐霜 www.tangshuang.net

【本文受版权保护】原创内容,盗版必究。【本文首发于唐霜的博客】
{
  hero: {
    name
    height
  }
}

这个结构描述了返回的数据的结构,且前端仅转载请注明出处:www.tangshuang.net【版权所有,侵权必究】需要这样一个结构,后端api接口可能返回【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】hero的更多信息,但是前端都不需要,因【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。此,前端只会接收到这个结构对应的数据。

【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。

我们可以想到前端在使用这段语法时的场景:

未经授权,禁止复制转载。原创内容,盗版必究。【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】
request(url, `
  {
    hero: { 
      name
      height 
    }
  }
`)

这样的一个用法看上去还不错,不过感觉非常【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】的弱,甚至鸡肋,它有点像一个配置,而非一【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】门语言。于是,我们把这个请求本身也设计到【本文受版权保护】本文版权归作者所有,未经授权不得转载。语言中:

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【作者:唐霜】本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】
GET "https://api.my.com/hero/{id}" -> {
  name
  height
}

你看,如此一来整个语法的雏形就诞生了,我【本文受版权保护】本文作者:唐霜,转载请注明出处。们用一段文本描述,明确的阐述了请求的文本原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。,是用来做什么的,相信但凡做过web开发【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net的人,都能读懂这段代码。

【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

那么,接下来,我们只需要有一个运行器,去著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。运行这段代码:

【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【未经授权禁止转载】
const data = await run(`
  GET "https://api.my.com/hero/${id}" -> {
    name
    height
  }
`)

这样,我们就得到了基本的关于整个语言的雏【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。形。接下来,我们围绕这一雏形,对语言进行【本文受版权保护】本文版权归作者所有,未经授权不得转载。丰富。

【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】

完善功能原创内容,盗版必究。

【原创不易,请尊重版权】未经授权,禁止复制转载。原创内容,盗版必究。转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】

描述语言的雏形一确定,基本上就确定了这门【未经授权禁止转载】【作者:唐霜】语言的格调,几乎所有的其他功能,都是在这【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】个雏形的基础上衍生、扩展、发散出来。就像【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】做一首曲子,从只有几个连续的音符作为灵感本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】,然后有了整首曲子一样。

【本文首发于唐霜的博客】【原创内容,转载请注明出处】【版权所有,侵权必究】【作者:唐霜】【作者:唐霜】

作为Restful API描述语言,它要本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】实现什么目标,基于这些目标,要提供什么功原创内容,盗版必究。【版权所有,侵权必究】能?

原创内容,盗版必究。【转载请注明来源】【版权所有,侵权必究】

在前端,我们从api接口拿数据,其实并不【本文受版权保护】本文作者:唐霜,转载请注明出处。需要什么特别复杂的编程过程,我们的主要目【未经授权禁止转载】转载请注明出处:www.tangshuang.net标,就是能够描述出前端请求数据的各种场景著作权归作者所有,禁止商业用途转载。【本文受版权保护】

【本文首发于唐霜的博客】【作者:唐霜】未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。

请求类型著作权归作者所有,禁止商业用途转载。

【关注微信公众号:wwwtangshuangnet】【作者:唐霜】本文作者:唐霜,转载请注明出处。【未经授权禁止转载】

我们已经有了GET请求的场景,那么POS【版权所有,侵权必究】未经授权,禁止复制转载。T、PUT、PATCH等请求的场景呢?我【原创不易,请尊重版权】原创内容,盗版必究。们来看下我的设计:

【转载请注明来源】【转载请注明来源】原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】
POST "https://api.my.com/heros" + {
  name
  height
  age
} -> {
  id
}

我们用+标识符表示这个请求将附带一个请求【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。体,该请求体需要满足绿色部分的结构描述。本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】你可能会想,我发送的请求数据呢?我可能还【本文受版权保护】【未经授权禁止转载】会发送文件呢。在运行时,我们这样使用它:

【原创不易,请尊重版权】【本文首发于唐霜的博客】【未经授权禁止转载】【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】
const data = await run(`
  POST "https://api.my.com/heros" + {
    name
    height
    age
  } -> {
    id
  }
`, {
  name: 'simolas',
  height: 195,
  age: 32,
  weight: 200,
})

我们在运行时,把要发送的数据通过参数的形【原创不易,请尊重版权】【未经授权禁止转载】式交给运行时引擎,引擎会帮我们剔除掉不需本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。要的多余字段。为什么要对提交的数据进行裁原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。剪?因为提交多余的字段,不仅提高网络阻塞著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。,而且有可能导致多出来的字段覆盖数据库中本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】的值,造成数据破坏。(当然,作为后端接口未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。的开发者,自己也应该做裁剪,这里只是希望【本文首发于唐霜的博客】【本文首发于唐霜的博客】在对一些老系统没有这样做的情况下,前端还本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net能提供这样的能力。)

【本文受版权保护】【版权所有,侵权必究】【转载请注明来源】

请求参数著作权归作者所有,禁止商业用途转载。

【原创不易,请尊重版权】【版权所有,侵权必究】【版权所有,侵权必究】

除了在url中提供一些search参数外【原创不易,请尊重版权】【原创不易,请尊重版权】,有的时候我们还需要在headers中提【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】供一些信息给服务端进行识别。我参照CUR【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.netL的参数写法,如下:

本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【原创内容,转载请注明出处】未经授权,禁止复制转载。
GET "..." -H "Content-Type: application/json" -H "Accept-Type: application/json" -> {
  ...
}

通过参数标记符-H,我们传递了两个Hea【本文首发于唐霜的博客】【未经授权禁止转载】ders信息。我们可以通过-H动态给一些本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】headers信息,例如cookie,或未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net者JWT的token。

【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【作者:唐霜】

并发组合请求【原创内容,转载请注明出处】

【版权所有,侵权必究】【本文首发于唐霜的博客】【本文首发于唐霜的博客】【原创内容,转载请注明出处】【版权所有,侵权必究】

有些情况下,我们需要一次性从多个接口取出原创内容,盗版必究。原创内容,盗版必究。数据,把这些来自多个接口的数据拼装成一个【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net给前端使用。于是我们提供一种特定的语法和未经授权,禁止复制转载。【原创不易,请尊重版权】命令:

【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】
GET "..." -> { name } as A

GET "..." -> { height } AS B

COMPOSE -> {
  name: (A.name)
  height: (B.height)
}

通过【未经授权禁止转载】as【版权所有,侵权必究】AS关键字,我们给一个请求的返回结果取了一个【版权所有,侵权必究】转载请注明出处:www.tangshuang.net别名,同时,我们提供一个COMPOSE命【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】令,在该命令的结构体中,按照取好的名字,【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。使用对应请求返回体中的数据作为新结构中字著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。段的值。一组命令中,一般只会有一个COM未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。POSE命令,且在最后进行返回。这样的C本文作者:唐霜,转载请注明出处。【未经授权禁止转载】OMPOSE命令自带了AWAIT全部其他转载请注明出处:www.tangshuang.net【转载请注明来源】请求的功能。

【本文受版权保护】原创内容,盗版必究。【本文受版权保护】【本文首发于唐霜的博客】【原创不易,请尊重版权】

在一组命令中,只有最后一个命令的返回结果原创内容,盗版必究。转载请注明出处:www.tangshuang.net将作为整组语句的执行结果进行返回。

转载请注明出处:www.tangshuang.net【作者:唐霜】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。

分段式请求本文作者:唐霜,转载请注明出处。

【转载请注明来源】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】

在一些场景下,我们需要先查询某些接口,基未经授权,禁止复制转载。【原创不易,请尊重版权】于该接口返回的结果,再去另外一个接口查询【作者:唐霜】原创内容,盗版必究。另外一个信息。于是我们又提供了一种特定的本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】语法和命令。

著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】
GET "..." -> { name } as A
GET "..." -> { height, ID } as B
POST "..." + {}

AWAIT A B

POST ".../?name=(A.name)&height=(B.height)" + { id: (B.ID) } -> { weight }

再沿用上面的组合语法的前提下,我们再提供【作者:唐霜】【原创不易,请尊重版权】一个AWAIT命令,用于分隔一个组,它的本文版权归作者所有,未经授权不得转载。【转载请注明来源】意思指在AWAIT之后的语句,必须等到A转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】WAIT之前的语句执行完毕之后,再开始执本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】行。同时,变量引用语法形式 (..),可以把前面提供的命名拿过来进行读取。基【作者:唐霜】【版权所有】唐霜 www.tangshuang.net于前面的语法规定,这组语句最终只会返回最本文版权归作者所有,未经授权不得转载。【转载请注明来源】后一条语句的结果。

著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】

AWAIT后面跟的名字,表示对应的请求必【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。须完成后才可以进入后面的语句的执行。假如【未经授权禁止转载】转载请注明出处:www.tangshuang.net某些请求没有被跟在AWAIT之后,意味着【关注微信公众号:wwwtangshuangnet】【本文受版权保护】这些请求可以继续执行,而不影响AWAIT原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。后面的语句。

【转载请注明来源】【作者:唐霜】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】

细节补充【原创内容,转载请注明出处】

著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】【未经授权禁止转载】未经授权,禁止复制转载。

显然,在实际开发中,我们还会面临一些特殊本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。的要求,这些要求不来自于前端或后端的需求原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net,而是来自使用上述语言进行编码本身。我们原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。需要补充一些细节,来满足编码过程中的一些转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。需要。

【转载请注明来源】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】

类型?格式化!原创内容,盗版必究。

【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。

在结构体中,你可能会想到,是不是应该规定著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net每个字段的类型?例如,age这个字段应该【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net是10,而后端给你的是”10未经授权,禁止复制转载。未经授权,禁止复制转载。″,这我在前端直接age.t【原创不易,请尊重版权】【原创内容,转载请注明出处】oFixed就会报错。类似错用后端返回值著作权归作者所有,禁止商业用途转载。【本文受版权保护】的错误经常遇到,那么我们是不是应该对后端【本文受版权保护】本文版权归作者所有,未经授权不得转载。返回的数据进行类型检查呢?应该,但没意义【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。。例如上面的例子,我们要的是10,而后端【本文受版权保护】转载请注明出处:www.tangshuang.net给的是”10″,本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。请问后端给错了吗?并没有,在很多情况下,原创内容,盗版必究。【本文受版权保护】后端数据库中存储的是字符串形式的数值,他转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net们不会为了照顾前端而还要额外花精力去遍历本文版权归作者所有,未经授权不得转载。【作者:唐霜】返回的数据,把其中的一些节点进行类型转化【转载请注明来源】著作权归作者所有,禁止商业用途转载。。因此,在前端,我们应该自动认为R【转载请注明来源】【关注微信公众号:wwwtangshuangnet】21;10″就是10.所以,【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】做类型检查可以,但是意义不大。那么什么才著作权归作者所有,禁止商业用途转载。【作者:唐霜】有意义呢?将”10̸【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。3;自动格式化为10才是有意义的。

转载请注明出处:www.tangshuang.net【本文受版权保护】著作权归作者所有,禁止商业用途转载。
GET "..." -> {
  age: number
}

在结构体中,我们通过:指明该字段在前端使本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。用时需要的数据格式,那么RestScri转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。pt的引擎就会自动把这个字段的值转化为该未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。类型。当age为”10本文版权归作者所有,未经授权不得转载。【本文受版权保护】243;时,就会自动转化为10,如果是其【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。他不可转化的值,例如null,那么会被转【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】化为0.

未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。【原创内容,转载请注明出处】

当然,这里的格式化应该是可定制的,例如前本文版权归作者所有,未经授权不得转载。【本文受版权保护】端可以自己定制number这个格式的行为本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net模式,遇到null时,到底是转化为0,还原创内容,盗版必究。未经授权,禁止复制转载。是保留null,可以通过这个定制来做到。

【转载请注明来源】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】

在请求的参数中,也支持格式化,例如:【原创内容,转载请注明出处】

【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。
GET "/api/some/{id:number}?type={type:string}" -> {}

总而言之,类型检查固然可以有,但是最重要未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】的是,我们应该进行格式化。

原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【作者:唐霜】【版权所有,侵权必究】【版权所有,侵权必究】

嵌套【原创不易,请尊重版权】

本文作者:唐霜,转载请注明出处。【作者:唐霜】【本文首发于唐霜的博客】

有些返回的数据里面,是具有嵌套层级的数据原创内容,盗版必究。【本文首发于唐霜的博客】,例如 { books: [ { title: 'book title', price: 12.3 }, { title: 'book title', price: 14.5 }] } 是一个嵌套了数组里面嵌套了对象的对象,未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net但是实际上,我们只需要读取每本书的tit著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netle就可以了,我们这样写结构体:

【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】
GET "..." -> {
  books: [
    {
      title
    }
  ]
}

通过对深层级的结构进行描述,我们可以对具【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。有嵌套结构的对象进行深度裁剪。例如:

【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net
{
  books
}

会把books这个数组的全部数据返回,而【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】

【未经授权禁止转载】未经授权,禁止复制转载。【转载请注明来源】
{
  books: [ { title } ]
}

会对数组的每一个元素进行裁剪,只返回其t【本文受版权保护】原创内容,盗版必究。itle字段。

本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】

能够具有这种嵌套性质的,有3类对象,分别【本文首发于唐霜的博客】【原创内容,转载请注明出处】是:

【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。
  • 对象 { name: string }【访问 www.tangshuang.net 获取更多精彩内容】
  • 【本文首发于唐霜的博客】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。原创内容,盗版必究。
  • 数组 [string]【原创内容,转载请注明出处】
  • 【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。
  • 元组 <string, numbe本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】r>
  • 原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】【本文受版权保护】【本文受版权保护】

它们都可以嵌套其他,也可以被其他嵌套。【未经授权禁止转载】

本文版权归作者所有,未经授权不得转载。【作者:唐霜】原创内容,盗版必究。

数组可预设多个,每个之间用本文版权归作者所有,未经授权不得转载。,连接,引擎会根据接收的数据的形状来决定使【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。用哪一个。另外,也支持对某些特定的位置进本文版权归作者所有,未经授权不得转载。【作者:唐霜】行规定,例如:

【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】
{
  items: [0:string, number]
}

意思是指,索引为0的元素使用string【原创内容,转载请注明出处】【未经授权禁止转载】格式,其他的使用number格式。这在特【未经授权禁止转载】本文作者:唐霜,转载请注明出处。定情况下还是比较有用的。

本文作者:唐霜,转载请注明出处。【转载请注明来源】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net原创内容,盗版必究。

筛选未经授权,禁止复制转载。

【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。

针对数组本文作者:唐霜,转载请注明出处。,我们可以通过筛选来让返回的数组元素减少【作者:唐霜】转载请注明出处:www.tangshuang.net到我们需要的值。

转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。
  • 通过索引号筛选本文作者:唐霜,转载请注明出处。
  • 【原创不易,请尊重版权】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】
  • 通过filter字符串筛选【本文首发于唐霜的博客】
  • 【转载请注明来源】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。

如上文列举的,通过传入索引号,而没有通用【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】格式器,则会筛选为只输出给定索引号元素:

未经授权,禁止复制转载。【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。
{ 
    items: [0:string, 1:number, 2:number] 
}

如上,items将只拥有3个元素。原创内容,盗版必究。

【关注微信公众号:wwwtangshuangnet】【作者:唐霜】本文版权归作者所有,未经授权不得转载。

对于元素为object的,还可以通过字符【本文首发于唐霜的博客】未经授权,禁止复制转载。串来规定筛选条件:

转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】未经授权,禁止复制转载。【转载请注明来源】
{
  items: ["age>10": { name, age }]
}

如上,items将只包含age属性大于1【本文首发于唐霜的博客】原创内容,盗版必究。0的元素。这里filter字符串只支持=本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】, >=, <=, >【原创内容,转载请注明出处】【原创不易,请尊重版权】, <这5种运算。同时,支持通过&【版权所有,侵权必究】【版权所有,侵权必究】amp;连接多个筛选条件来缩小筛选范围。【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。不支持“或”的关系。

原创内容,盗版必究。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

结束标识符【未经授权禁止转载】

【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net

语句结束怎么来判定呢?上文所有的案例,都未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】是以换行作为语句结束的标识符,但是实际上【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net,有3种用于表示结束的标识符,分别是:

本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。
  • 换行 \n【版权所有】唐霜 www.tangshuang.net
  • 【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net
  • 分号 ;本文版权归作者所有,未经授权不得转载。
  • 【本文受版权保护】【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net
  • 逗号 ,原创内容,盗版必究。
  • 未经授权,禁止复制转载。未经授权,禁止复制转载。【原创不易,请尊重版权】【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。

例如下面的代码:【访问 www.tangshuang.net 获取更多精彩内容】

【本文首发于唐霜的博客】【未经授权禁止转载】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。
GET "..." -> {
  name: string 
  age: number,
  height: number;
}

你可以直接把一些简单的typescrip本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.nett代码拷贝过来:

本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【作者:唐霜】【作者:唐霜】
{
  name: string;
  age: number;
  height: number;
}

注释【版权所有,侵权必究】

【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。

你可以使用//进行注释,但是需要注意,注【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net释必须独立一行,不可与代码混在一行。使用【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。 /* … */ 可多行注释【转载请注明来源】原创内容,盗版必究。

本文版权归作者所有,未经授权不得转载。【作者:唐霜】【版权所有】唐霜 www.tangshuang.net【作者:唐霜】本文作者:唐霜,转载请注明出处。
GET "..." -> {
  name: string
  age: number

  // 注释
  // 更多注释
  height: number

  /**
   * 多行注释
   * 再来一行
   */
  weight: number
}

换行著作权归作者所有,禁止商业用途转载。

著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【本文受版权保护】

你可以使用\进行换行,但是需要注意,在大【作者:唐霜】著作权归作者所有,禁止商业用途转载。部分开发语言中\是转义字符标记,因此,你【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net可能需要使用\\才能得到一个\字符。

未经授权,禁止复制转载。【本文首发于唐霜的博客】【本文受版权保护】著作权归作者所有,禁止商业用途转载。
GET "..." \
// 换行效果
-> {
  name: string
}

一句语句除了在值部可以换行,不推荐在参部本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。换行。另外,as 语句(设置别名语句)不可以换未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net行,一旦换行,就会被错误理解。

【原创不易,请尊重版权】【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net

修饰符著作权归作者所有,禁止商业用途转载。

原创内容,盗版必究。【本文受版权保护】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【原创不易,请尊重版权】

还有一些比较特殊的场景,例如你可以允许后著作权归作者所有,禁止商业用途转载。【转载请注明来源】端返回的结果中,不存在该字段,你自己在前著作权归作者所有,禁止商业用途转载。【本文受版权保护】端代码中通过 typeof xx === 'undefined' 来执行一些逻辑。用于处理这类问题的,我【未经授权禁止转载】【未经授权禁止转载】统称为修饰符。修饰符被挂在字段名后面:

【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】
GET "..." -> {
  name: string
  age: number

  // height字段可以不存在,如果存在的情况下,会被格式化为number
  height?: number 
}

修饰符有4个【版权所有,侵权必究】

转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】
  • ? 可选修饰符,字段可以不存在【转载请注明来源】
  • 【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】【原创不易,请尊重版权】
  • ! 强制修饰符,强制使用对象或数组【原创不易,请尊重版权】
  • 本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。原创内容,盗版必究。
  • ?? 可选为空修饰符,允许字段不存在或者【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。为null,如果不存在将为null
  • 原创内容,盗版必究。【版权所有,侵权必究】【转载请注明来源】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。
  • ~ 链接修饰符,将后端的字段名映射为前端原创内容,盗版必究。【作者:唐霜】字段名
  • 本文版权归作者所有,未经授权不得转载。【本文受版权保护】原创内容,盗版必究。

! 可以强制把原本为数组的字段平铺为对象,【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】或把原本为单个对象的字段作为以它为元素的本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net数组。举个例子:

【本文首发于唐霜的博客】【转载请注明来源】【原创不易,请尊重版权】
{
  region!: {
    region_id
  }
}

返回的结果中,如果是 【关注微信公众号:wwwtangshuangnet】{ region: [ { region_id } ] } ,经过强制平铺后,你将得到 【原创内容,转载请注明出处】{ region: { region_id } } 这个对象,它把数组的第一个元素作为当前未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。字段的值。同理,你也可以把一个对象强制转【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。化为数组,转化后的数组只包含一个元素,这【本文首发于唐霜的博客】【原创内容,转载请注明出处】个元素就是原来的对象。

转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。原创内容,盗版必究。转载请注明出处:www.tangshuang.net

?? 实际上包含了 【转载请注明来源】? ,它一方面可以允许字段不存在,另一方面【版权所有】唐霜 www.tangshuang.net【本文受版权保护】允许字段为null。但是无论这两种情况中本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。的哪一种,只要值不符合预期,它都会让该字【未经授权禁止转载】【原创不易,请尊重版权】段的值为null代替。

【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】【版权所有,侵权必究】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

~ 则提供了一种可以实现字段名映射的方式,原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】例如:

【未经授权禁止转载】【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。
{
  name~title: string
}

这一句将后端的title字段映射为前端的【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。name字段,因此,它叫“链接修饰符”。著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。这样做的好处在于,当后端调整了字段名之后原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】,前端只需要修改此处对应的后端字段名,而【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net不需要调整前端业务代码中的字段名。

著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】原创内容,盗版必究。原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。

它可以和其他修饰符一起使用。例如:【转载请注明来源】

著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【本文受版权保护】
{ name!??~title }

另外,~修饰符支持表达式链接。例如:【原创不易,请尊重版权】

【转载请注明来源】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。
{ name~($.data.books)??: [{ book_id, book_name }] }

表达式映射后,要以表达式结果作为值继续提【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】取数据。例如上面的 [{ book_id, book_name }] 实际是从 本文版权归作者所有,未经授权不得转载。$.data.books 的格式出发去取的。本文版权归作者所有,未经授权不得转载。

【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【原创内容,转载请注明出处】【本文受版权保护】

多个修饰符的顺序是无关紧要的,你可以随意原创内容,盗版必究。【本文受版权保护】调整它们的顺序,例如 name!??【本文首发于唐霜的博客】name??! 是一样的。原创内容,盗版必究。

本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】原创内容,盗版必究。未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】

操作符本文版权归作者所有,未经授权不得转载。

【转载请注明来源】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。

修饰符对字段名起作用,操作符对字段格式起【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net作用。我们有1个操作符:

转载请注明出处:www.tangshuang.net【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。【本文受版权保护】
  • & 引用片段(下文详解)【作者:唐霜】
  • 【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】原创内容,盗版必究。转载请注明出处:www.tangshuang.net

片段【未经授权禁止转载】

转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。

有些结构实际上会被多次用到,例如在你的返【转载请注明来源】【版权所有,侵权必究】回结果中有 readers, buyer【本文首发于唐霜的博客】【本文首发于唐霜的博客】s, managers,它们都是关于一组【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net人员的数组,它们的结构实际上都是一样的,转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。此时,你可以使用片段来使用同一种结构。

【作者:唐霜】【转载请注明来源】原创内容,盗版必究。
DEFINE person: {
  user_id
  user_name
}

你需要使用define命令,配合:标识符本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】,定义一个片段,之后,你需要使用&【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】;标识符来引用该片段:

【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】
GET "..." -> {
  readers: [&person]
  buyers: [&person]
  // manager是单个人
  manager: &person
}

被引用的片段,在实际运行时,会进行展开,【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。也就是说manager实际上是一个包含u本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.netser_id, user_name两个字【作者:唐霜】【作者:唐霜】段的对象。

【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。

插值【版权所有,侵权必究】

著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。

在参数部分,支持使用 【未经授权禁止转载】{} 作为插值,在运行时替换为某个具体的值。原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】参数部分只在命令后面,结构体前面的部分,【作者:唐霜】转载请注明出处:www.tangshuang.net例如下面:

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】
GET "..." -H "..." -> {}
POST "..." -H "..." + {} -> {}

这个部分常常是在具体运行时才确定的,例如原创内容,盗版必究。本文作者:唐霜,转载请注明出处。你要请求的是具体哪个id的资源,请求时需【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】要携带的token是什么。这些动态的值在本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。语法中使用 {} 作为插值展位进行标记。具体如下:【转载请注明来源】

【作者:唐霜】【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net
GET "https://api.my.com/artciles/{id}" -H "JWT-Token: {jwt}" -> {
  ..
}

在运行时,我们通过传入具体的某个参数:【版权所有,侵权必究】

本文版权归作者所有,未经授权不得转载。【转载请注明来源】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】
const data = await run(code, { id: 123, jwt: 'xxx' })

通过传入一个vars参数,来替换语句中使本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】用的插值。

【未经授权禁止转载】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net

参数必传/可选【版权所有,侵权必究】

本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【作者:唐霜】

在url中,我们常会通过search q【本文受版权保护】本文版权归作者所有,未经授权不得转载。uery来传递参数,但是这些参数在某些情【作者:唐霜】【转载请注明来源】况下是必传的,我们通过一个特殊的标记来强【转载请注明来源】【原创不易,请尊重版权】调这个必传:

【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】
GET "/api/v1/somes?code={code!}&name={name}&age={age?}"

上面的code是必传的,age是非必传的转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】,name是必传的(默认),如果给的pa【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】rams中不存在name、code、ag转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.nete,在最终请求时不会存在name、cod【版权所有,侵权必究】【本文受版权保护】e、age参数,但由于code、name转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】是必传,如果code、name不存在,则原创内容,盗版必究。【本文首发于唐霜的博客】会通过debug报一个error错误。因未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net为code用!进行了强调,所以,当cod【本文受版权保护】【本文首发于唐霜的博客】e没有传的时候,在url中仍然会存在该参【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。数并给空值。因此,如果上面的所有参数都没本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】有给,那么会出现如下现象:

本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。
  • debug报code、name没有传【转载请注明来源】
  • 原创内容,盗版必究。【本文首发于唐霜的博客】未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。
  • 请求 /api/v1/somes?cod原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。e=
  • 未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】

注意,末尾的code强制传入了空。【本文受版权保护】

【本文受版权保护】【作者:唐霜】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

表达式【版权所有】唐霜 www.tangshuang.net

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【本文受版权保护】【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】

在上文中我们也给出了在await语句后面【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。,引用前面的别名作为引用的情况,我们再来【本文受版权保护】【转载请注明来源】回顾一下。

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。
GET "..." -> { name } as A
GET "..." -> { height } as B

AWAIT A B

GET ".../?name=(A.name)&height=(B.height)" -> { weight }

表达式通过 本文作者:唐霜,转载请注明出处。(..) 括号括起来,其内部表达式类似JS表达式本文作者:唐霜,转载请注明出处。原创内容,盗版必究。语法,可以引用上文中as后面的别名作为变【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。量读取信息:

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。
GET "..." -> { height, ID } as B 

AWAIT A B 

POST "..." + { id: (B.ID) } -> { weight }

除了引用变量,你还可以在 本文版权归作者所有,未经授权不得转载。(..) 中使用简单的表达式(本文作者:唐霜,转载请注明出处。注意,这依赖于引擎的实现【原创不易,请尊重版权】),例如:转载请注明出处:www.tangshuang.net

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】本文作者:唐霜,转载请注明出处。
COMPOSE -> {
  total: (a.total + b.total)
}

此处通过多个变量计算出最终的total。

原创内容,盗版必究。转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【本文受版权保护】

在 (…) 内部支持多个表达原创内容,盗版必究。【原创不易,请尊重版权】式,但只有最后一个表达式的执行结果会作为【版权所有,侵权必究】【版权所有,侵权必究】运行结果交给需要使用的节点。

【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】

同时,(..) 承担着给格式器传参数的功【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】能:

【本文受版权保护】本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】
GET ".." -> {
  date: date('YY-MM-DD')
}

当 ( 前方有对应的格式器名字时,它就代【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。表着传参,当然,其内部仍然是表达式,只不转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】过此处的表达式结果为一个字符串而已,你可【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】以引用变量作为参数。

转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。

表达式还出现在~链接修饰符后面:本文版权归作者所有,未经授权不得转载。

转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【原创内容,转载请注明出处】【转载请注明来源】
{ name~($.data.books)??: [{ book_id, book_name }] }

插值和表达式虽然看上去差不多,主要不同:

【版权所有,侵权必究】原创内容,盗版必究。原创内容,盗版必究。
  • 插值只能在参部(url和headers)本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。使用,只能引用外部传入的vars,这个v【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。ars只能来自运行时传参
  • 转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】
  • 表达式可同时在参部和值部使用,只能引用上【作者:唐霜】未经授权,禁止复制转载。文中的变量作为表达式(而无法使用运行时参【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。数),也可以是普通值表达式(如字符串、数【本文首发于唐霜的博客】【原创内容,转载请注明出处】字)
  • 未经授权,禁止复制转载。【作者:唐霜】【未经授权禁止转载】

大小写不敏感著作权归作者所有,禁止商业用途转载。

本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【本文受版权保护】【关注微信公众号:wwwtangshuangnet】

所有命令及关键字,都是大小写不敏感的,也原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。就是说在描述中,as等价于AS, GET原创内容,盗版必究。【未经授权禁止转载】等价于get。

原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】【本文受版权保护】

语法归类未经授权,禁止复制转载。

转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。

以上就是SRL这门语言的几乎所有内容了。【原创内容,转载请注明出处】【本文首发于唐霜的博客】我们将语言的这些内容进行归类,大致如下:

【本文受版权保护】【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net
  • 命令未经授权,禁止复制转载。
  • 【本文受版权保护】【本文受版权保护】【作者:唐霜】未经授权,禁止复制转载。【本文受版权保护】
  • 标识符【转载请注明来源】
  • 本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【本文受版权保护】
  • 参数【版权所有】唐霜 www.tangshuang.net
  • 转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。
  • 结构体 原创内容,盗版必究。
    • 格式器【转载请注明来源】
    • 【未经授权禁止转载】【作者:唐霜】【未经授权禁止转载】【未经授权禁止转载】转载请注明出处:www.tangshuang.net
    • 修饰符【关注微信公众号:wwwtangshuangnet】
    • 【版权所有】唐霜 www.tangshuang.net【转载请注明来源】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net
    • 操作符【原创不易,请尊重版权】
    • 【未经授权禁止转载】原创内容,盗版必究。原创内容,盗版必究。
    • 嵌套【关注微信公众号:wwwtangshuangnet】
    • 【转载请注明来源】【原创内容,转载请注明出处】【原创不易,请尊重版权】
    • 片段【关注微信公众号:wwwtangshuangnet】
    • 著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。
  • 未经授权,禁止复制转载。原创内容,盗版必究。【转载请注明来源】【转载请注明来源】
  • 别名【未经授权禁止转载】
  • 本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【版权所有,侵权必究】【未经授权禁止转载】未经授权,禁止复制转载。
  • 插值【访问 www.tangshuang.net 获取更多精彩内容】
  • 本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】
  • 表达式【转载请注明来源】
  • 【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net
  • 注释【本文首发于唐霜的博客】
  • 著作权归作者所有,禁止商业用途转载。【作者:唐霜】【本文受版权保护】【关注微信公众号:wwwtangshuangnet】
  • 换行【转载请注明来源】
  • 未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。
  • 参数必传/选传本文版权归作者所有,未经授权不得转载。
  • 【转载请注明来源】【本文受版权保护】【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net

命令包含4种:请求命令,如GET, PO【版权所有,侵权必究】【未经授权禁止转载】ST, PUT, DELETE;组合命令本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】,如COMPOSE;分段命令,如AWAI【版权所有,侵权必究】【原创内容,转载请注明出处】T;片段命令,如FRAGMENT。实际上未经授权,禁止复制转载。【原创不易,请尊重版权】,我们并不要求命令必须是大写,只是为了在【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。描述中可以让人一眼找到一条语句的开头,所【原创不易,请尊重版权】原创内容,盗版必究。以用大写是一种规范。一组命令的执行结果,【本文首发于唐霜的博客】【本文受版权保护】总是最后一条的响应体部分。

未经授权,禁止复制转载。【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。

标识符包括:-> 用于指向返回的响【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】应体结构,+ 用于附带请求体的结构体,F转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netRAGMENT语句中的:前面是片段名后面本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。是结构体,& 用于引用对应的片段【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。,\n 和 ; 和 , 用于结束语句。

【转载请注明来源】未经授权,禁止复制转载。未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】

参数包含2种:命令参数,例如GET后面的著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。”…”【本文首发于唐霜的博客】【本文受版权保护】; url;标记参数,可以使用-H等进行转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。标记的参数。参数中可以使用 {{}} 插值。【原创内容,转载请注明出处】

【版权所有,侵权必究】【原创不易,请尊重版权】【作者:唐霜】著作权归作者所有,禁止商业用途转载。

结构体是专门用来描述一个数据应该以什么形【作者:唐霜】【未经授权禁止转载】式存在的部分,是SRL中的主体部分。它包【未经授权禁止转载】【作者:唐霜】含格式化、修饰符、操作符,嵌套、片段等各【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】种语法或用意。

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。未经授权,禁止复制转载。未经授权,禁止复制转载。

在一条【本文首发于唐霜的博客】请求著作权归作者所有,禁止商业用途转载。的末尾使用as关键字可以给这条请求取一个【本文受版权保护】著作权归作者所有,禁止商业用途转载。别名。请求是指以请求命令开头的语句。在不【本文受版权保护】本文版权归作者所有,未经授权不得转载。同的情况下,别名指代的意义不同。别名可被著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。用于AWAIT后面,表示等待这些请求完成原创内容,盗版必究。【转载请注明来源】之后,才能进入下面的语句的执行。别名可以【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net被用于COMPOSE中,用于把对应请求的【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。结果组合在一起。别名可以在AWAIT之后【转载请注明来源】【本文受版权保护】的参数部分被用到插值中。

著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【作者:唐霜】原创内容,盗版必究。【转载请注明来源】

插值仅能在参数部分被使用。【未经授权禁止转载】

【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

注释必须独占一行,【版权所有】唐霜 www.tangshuang.net不能未经授权,禁止复制转载。和语句同在一行。【原创不易,请尊重版权】

【转载请注明来源】著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。原创内容,盗版必究。【作者:唐霜】

必传通过插值末尾!来表示。本文版权归作者所有,未经授权不得转载。

本文版权归作者所有,未经授权不得转载。【作者:唐霜】本文版权归作者所有,未经授权不得转载。

完整的看,一条语句可能包含如下:【版权所有,侵权必究】

【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】原创内容,盗版必究。
// 注释
命令 命令参数 [: 片段体] [标记参数] [+ 请求体] [-> 响应体] [as 别名] 

例如
// 片段
FRAGMENT fragmentName: { ... }
// 请求
PUT "..." + { .. } -> { ...}
GET "..." -H "Content-Type: ..." -> {}
// 组合
COMPOSE -> { .. } as some
// 分段
AWAIT a b

一个属性节点的形式:本文作者:唐霜,转载请注明出处。

本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net
[字段名][修饰符][: [操作符][名字][(表达式)]]

例如:
// 字段
name?~title: &fragment1
// 数组中的某个元素
[string, 2: date("YY-MM-DD")]

上面的[]部分是可选的部分,没有这些部分【转载请注明来源】【版权所有,侵权必究】,该命令也是可以被执行的。

【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。
命令 参数部分 ... {
  key: 格式器
}
  • 插值,只能在参数部分被使用,包含命令参数著作权归作者所有,禁止商业用途转载。【本文受版权保护】和标记参数两部分中都可以使用
  • 【作者:唐霜】【本文首发于唐霜的博客】【原创内容,转载请注明出处】
  • 表达式,可以在参数部分和格式器部分使用,本文版权归作者所有,未经授权不得转载。【本文受版权保护】格式器部分可能作为函数参数的标记
  • 未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

以上就是SRL这门语言的全部,你看是不是【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net也并不复杂。

【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。

结语【本文受版权保护】

转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】【转载请注明来源】

我们不是去为设计一门语言而设计,而是为解【本文受版权保护】本文版权归作者所有,未经授权不得转载。决前端问题而去设计。SRL的核心在于它是【原创内容,转载请注明出处】【原创不易,请尊重版权】可选的,你可以用它,也可以不用它,使用它【原创内容,转载请注明出处】【版权所有,侵权必究】的改造成本非常低,对前后端原有的架构没有本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】任何影响,但是它却解决了关于前端请求的抽本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。象问题。我们通过SRL,可以让我们的接口【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net文档更简单,不需要类似swagger之类转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。的工具,因为SRL本身就是文档,阅读SR【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】L就是阅读前后端接口的交付和使用本身。本本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】文所列举的是SRL的当前这个版本,将来可转载请注明出处:www.tangshuang.net【作者:唐霜】能还会有变化,但是有些核心原则永远不会变未经授权,禁止复制转载。原创内容,盗版必究。,就是我们是要解决问题的,我们让问题变得著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。简单,而不是更复杂。当然,单有SRL还是【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】不够的,我们还需要有一个运行时去执行SR【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】L,下一篇文章我会详细介绍它的实现 re转载请注明出处:www.tangshuang.net【版权所有,侵权必究】stscript 这个库。你可以关注我的【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net博客或公众号 wwwtangshuang著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。net 获得有关它的实时更新。

【本文首发于唐霜的博客】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

如果你觉得本书对你有帮助,通过下方的二维码向我打赏吧,帮助我写出更多有用的内容。

2022-04-04

已有2条评论
  1. 张三 2022-11-04 17:03

    在vue2脚手架搭建的项目下运行报错,大佬可以帮忙解决么

    • 否子戈 2022-11-04 17:18

      代码和截图看看