|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。近一年半,我介入了两到三个项目标事情,这些项目触及到大批供“内部”利用的RESTAPI,稍后我们会看到为何要将“内部”这个词放在引号当中。在项目事情时代,我不能不对这些API举行重复地计划,再计划和重构,这篇文章是我对RestAPI最好理论的一些团体意见,但愿读者可以从中获益。
更好、更早地计划
关于良多言语来讲,完成RESTService是一项极为微乎其微的义务。换言之,不管你选择甚么底层框架,只需辅以大批设置和代码,你能够在一小时以内就具有一个RESTService。固然关于缺少履历的人来讲,这的确很便利,但它也很简单让你敏捷写出一个质量低下的API。因而,在你编写代码之前,先留出一分钟的工夫思索一下,试着往计划你的API,花充足的工夫往了解营业范围,判别客户端必要从你的体系中猎取甚么。举个例子,假如你的体系是针对一群硬币保藏家所创建的数据库,此时你必要决意的是:你是不是同意客户端增加新的硬币,大概仅仅同意掏出原本的硬币;客户必要甚么样的查询体例;假如赶上触及大批数据检索的哀求,你怎样处置它?尽早地回覆这些成绩可以匡助你开辟出更切近用户需求的API。
称号与办法
如今已很有多关于资本(Resource)定名和构造的会商了,在这里我基于本人的履历再老调重弹一下,以下是三种易于遵守的标准。
1.只利用名词:举个例子,假如你想供应一项在数据库中搜刮硬币的服务,要制止将端点(Endpoint)定名为/searchCoins或/findCoins或/getAllCoins等等,一个复杂的/coins就已充足了,当客户端发送一个GET哀求的时分,能够取得一切无效硬币的汇合。相似的,假如你想供应一项在数据库中增加硬币的服务,要制止利用诸如/addCoin或/saveCoin或/insertCointToDatabase如许的称号,你可使用与下面不异的资本称号,要改动的仅仅是用POST哀求取代GET哀求。一样地,关于更新硬币,可使用PUT哀求。
2.假如必要猎取单个硬币,又应当怎样做呢?我所倡议的最好体例是在端点中到场一个参数,好比说客户端必要拿到一个ID是20的硬币,那末发送一个哀求到/coins/20就充足了。我们再来看一个更庞大的例子,假如要让客户端可以为每一个硬币增加一张图片,一个疾速而丑恶的体例是/addCoinImage或/addNewImageToCoin等等,一个稍好一点的体例是/coins/addImage,可是正如我之前所说的,不该该有任何动词存在。还记得我们之条件到的猎取某种硬币的办法吗?我们能够将其略微加强一下,发送POST哀求给/coins/20/images怎样?今朝看起来很不错。不外世界没有完善的事物,假定一下,假如我们要让一些超等用户可以从体系中删除硬币,依据我们之前的会商,一个复杂的DELETE哀求发送给/coins/{id}就充足了,可是请你想一下,假如{id}仅仅是COINS表中的一个按次编号,那会发生多年夜的成绩?或人能够容易地一个接一个的发送DELETE哀求,最初体系中一切的数据全没了。我想说的重点是,利用标识符作为哀求参数是不错,可是条件是这些标识符必需很难推测或基本没法推测。以是,假如你想要用一串序号往断定一个实体,那就忘了这类完成吧。我的倡议是,不要利用资本参数,间接发送一个DELETE哀求给/coins,分离一个requestbody(好比json),个中含有充足的参数可以定位所要被删除的实体便可。
3.尽量利用特定范畴的称号。假如你的营业域中有一群硬币保藏家(CoinCollectors),那末当你计划API的时分,应该利用collectors这个词,而不是users或accounts。要制止利用一些意义过于广泛的称号,这些称号不克不及暗示甚么,到了客户端又简单发生曲解。关于哀求参数的定名,事理也是一样的。别的,激烈倡议给哀求参数取一个尽量短,同时又成心义的称号,举个例子,假如你想要查找在某一指定年份刊行的硬币,一个很赞的参数称号是issueYear,对照典范的反例是:year(意义不明白),yearOfFirstIssue(包括无用信息)。
毛病处置和呼应
关于这个话题,我的履历是让客户端在每次发送哀求后,不管了局是乐成仍是失利,都能取得不异格局的json呼应,这将会给客户端处置带来极年夜的匡助。举个例子,你想要增加一个新的硬币,向/coins发送POST哀求,一个乐成的呼应包括以下json文档:
1
2
3
4
5
6
7
8
{
"meta":{
"code":200
},
"data":{
"coinId":"a7sad-123kk-223"
}
}
一个毛病的呼应多是如许的:
1
2
3
4
5
6
7
8
9
{
"meta":{
"code":60001,
"error":"Cannotaddcoin",
"info":"Missingoneoremorerequiredfields"
},
"data":{
}
}
请注重,对一切大概的了局(乐成或失利),json呼应的文档都具有不异的布局,个中有两种基础元素:meta和data,meta包括了局信息,在堕落的情形下,个中还会包括一个特别的毛病码(errorcode),在毛病码以后,”error”暗示堕落的内容,”info”暗示堕落的详细形貌;data是可选的,包括从服务器前往的一切数据,就拿下面的例子来讲,当增加硬币乐成后,服务器会前往一个独一的主动天生的标识符,假如有毛病,这项就为空。这类做法的上风是,关于统一个API的各类服务范例和了局,客户端都能够接纳不异的体例举行处置。别的,当成心外情形产生时,我们也能够传送一些分外的信息,正如下面例子中所展现的,”error”转达信息,”info”纪录日记。我们另有一种选择,能够基于毛病码去向理呼应,只需明白每一个数字的寄义便可,请注重这些数字并不是http形态码,你仍然要为每一个哀求前往准确的http形态码(如400、401等)。
在我们会商下一节之前,我想夸大另外一件值得器重的事,假定我们不同意删除硬币,可是客户端实验向/coins/{id}发送一个DELETE哀求,一般情形下Web容器会前往一个405的形态码,但我发明,假如我们对这些呼应举行过滤并前往不异的json文档,会很有匡助。好比我们能够前往:
1
2
3
4
5
6
7
8
9
{
"meta":{
"code":405,
"error":"Methodnotallowedforthe/coins/{id}resource",
"info":"MethodDELETEisnotallowedforthatresource.Availablemethods:GET,POST,OPTIONS"
},
"data":{
}
}
这比本来很多多少了,不是吗?如今,呼应内容不仅包括原本的信息(405形态码),还关照客户端该资本可用的办法。
java是一种面向对象的编程语言,优点是可移植性比较高,最初设计时就是本着一次编写到处执行设计的。可以开发各种应用程序和游戏,不过速度没有c++快,所以一般是不用java来编写应用程序和电脑游戏。 |
|