00:00
接下来看一下创建端点。啊,端点其实就是路由的另一个说法,但是我们在讨论API的时候,很多人会把这个访问的路由称作是一个端点啊,所以这里也其实就是创建路由的意思。在哪里去创建我们的路由呢?在这个。Root里面有一个api.pp啊,在这里面去创建我们的路由。我们把这个它拉自带的这个给删掉就行了,没有什么用啊,因为我们不使用拉的去写。我们使用这个定格API,不使用LA默认的去写啊,为了就是说和我们的这个love的一些路由产生冲突,所以啊,这个定格API将会。嗯,使用其专属的一个路由实例,也就是说我们要创建端点,首先要获得一个API路由的实力啊,就是使用。这个实例。啊,接下来。使用这个API实例提供的一些方法去创建我们的路由就可以啊,其实大致的方式和我们之前写啊,使用那个root创建都是一样的啊,但是。
01:07
使用这个定位篇,我们创建的时候呢,必须得先定义一个分组啊,定一个版本组。啊,因为我们这个API是支持多个版本的,这种定义方式有利于我们后期啊,为同相同端点去增加多版本的一个支持。知道吧,然后。这里我们创建一个啊。好。我们的路由就写在这个对应的版本里面,当然你可能也会有这个其他的一些版本,比如说VR是吧啊。如果想让这一组路由啊,支持多个版本的话,可以用数组的形式啊,还可以就是说加入第二个参数去增加一些全局的一些标准组,也就是我们比如说全局所使用的一些中间件什么的都可以。啊,或者去放到这个组里面去进行进一步的去分组,这些用法和love的这个我们路由的用法啊,都是大致一样的。
02:06
那接下来怎么创建端点,创建端点主要使用这个API的啊,提供的这个get啊,Post啊等这些方法啊,其实呃,可用的方法也和呃,那个root那些方法都差不多啊。比如这里啊,我们就创建了一个。使用API的这个get方式啊,就创建了这么一个路由,好。这里啊,我们去,嗯,创建一个。Test control make。Controller test controller啊。嗯。PP啊,这个现在是我们C盘,这是我们本机是吧,本机是没有这个PP命令啊,所以我们去。
03:04
我们的这个里面啊,就是虚拟机的这个项目里面去执行PP art。Make。C的test,我们创建一个test的control啊。好,创建成功,然后在我们的APP htp这里面多了一个text ctrl,这里我们请求。Test去访问谁呢?呃,路由你可以使用这种方式啊,路由的这个命名空间啊,加上这个艾服加个方法,也可以使用这个我们拉八的一个方式,因为我使用的是学的就是拉八嘛,啊直接一个数组,第一个参数是我们的test controller的这个类名。Test control冒号class类名,第二个参数是要什么使用什么方法,就是使用index方法,接下来去test里面啊,就可以创建一个index方法。
04:06
好,这样就可以啊,当我们请求,它就会把我们的请求啊给传入test ctrl的index方法。啊,这是简单的去创建了一个端点。接着看啊。啊,我们可以就是说呃,因为对这个呃端点呢去进行了分组,所以我们可以创建不同版本的就是同端点啊在使用的时候,就是在请求这些API的时候,我们加上这个版本号就可以了,当然版本号呢是在这个请求这个文档里面,可以看到是加在这个头部的这个accept里面。这里我们就先不加了啊。然后。接着往下看啊。就是看看这个命名路由和啊如何去生成这个URL命名路由呢。啊,就是可以使用这种方式啊,加一个这个参数就可以了。
05:04
啊,就是把我们后面的这个数组里面写什么呢?写as和这个右啊去进行一个命名,当然在生成这个链接的时候可以使用啊。URL啊,这个。然后去加上这个版本号,去生成这个链接,一定要提供这个版本,因为你看我们可以有不同的版本号,使用相同的一个。这个链接的啊。好。接下来我们尝试一下啊。去定义一个。这个具有名字的。啊,这个。端点啊,我们还称为路由吧,命名路由,使用这种方式。这里我们请求。嗯。内幕吧,好,然后是。txt.name。
06:00
把名字改一改,使用什么方使用test controller。啊,使用我们的这个啊。这个controller里面的什么方法,改成name方法可以吧?哎,这么去去写。好注意啊,这个命名路由的话,就是命名路的话,这里就是不能再使用这种这种数组的方式啊,这种去定义了,只能是使用这种字符串,然后是这个类的一个命名空间加这个。接下来我们去啊请求这个地址,然后我们在这个地址里面输出我们的这个链接啊,那怎么生成链接呢?你看这里我们请求这个name啊,这个地址它访问的是啊test里面的这个name方法,所以我们要去建一个name方法啊。内幕啊,那我们在这里去生成一下我们的链接看一下啊。这个dota URL等于。
07:03
啊,使用。这个啊,然后一定要加上这个版本号,然后就使用我们的名字,路由的名字,我们是test.name看一下我们的链接生成的对不对。好。最后我们直接DD这个dota URL。他怎么请求?怎么请求他呢?啊,因为是get请求,所以我们直接在浏览器里面就可以请求,对吧,当然用postman也可以,这里我们直接先用浏览器去看一下啊。一定要加上这个APIAPI,因为我们设置了这个路由的一个前缀嘛,看一看是不是设置了这个路由的前缀,所以一定要加上这个前缀,接下来是我们的。定义的这个路由,也就是在一篇里面定义的这些路由啊,我们先请求下test,你看一下test,因为我们没有任何输出啊。Test是因为没有任何输出,所以空白,接下来请求我们的内幕,我们在内幕里滴滴了啊,这个UR是不是。
08:01
和这UR一样,哎,这样就证明了我们可以直接使用这个方式去获取啊,命名路由的一个urr。这是关于。啊,这个。命名和生成URL这一块啊,其实一般的话很少用啊,因为我们不像是写这种带视图页面呢,会大量的使用到URL啊,因为我们写API的话啊,很少用到这种命名啊。接下来可以使用这个命令啊,去查看我们所有的这个API的一个路由,比如API root。在哪呢,也是就是所有的这个命令啊,都是在我们这个虚拟机里面去执行的啊。当然,如果你的本机Windows如果安装了PP,或者这个环境都是完整的,也可以去执行。这里我们在虚拟地面执行PP。嗯,API冒号roots,看一下我们所有的API的路由,现在呢是有着。啊,这两个。
09:00
啊,放大一些。有一个啊,这是我们的请求方式,然后U,然后名字说这个去访问的这个action啊,控制器里面的哪个方法。然后是否是受保护的版本啊对吧。好。这个是我们的端点啊,那接下来看一看。怎么去?创建这个响应啊。其实一个可以用的API,简单的来说就是要接收请求,并且能将响应返回给客户端。对吧,一般来说API有多种处理,呃的这个响响应的一个方式。啊,例如这个杰森,而具体怎么使用取决于我们API的一个复杂程度。通常来讲啊,最简单的方式就是直接给返回一个数组。或者是对象,但并不是所有的对象都能被正确的给格式化啊,这个对象必须得就说实现了啊,数组的这个对象,或者说实现了啊,这个数组的这个接口才可以。
10:06
当然。我们的模型。模型类继承了啊这个model。所以说啊,它的结果是一个集合嘛,是可以被格式化成数组的,这个时候就可以啊,直接返回。啊,当然也可以去返回单一的一个用户啊,这个例子我们来看一下,但是在看之前我们先进行一些准备,对吧,我们是有这个有色模型的,但是我们的数据库你来看一下。是不是并没有表对吧,你看在数据库里面并没有表是不是。我们看一下这个迁移文件,已经给我们准备了这个用户表。所以我们只需要运行迁移就可以啊,基于这个迁移文件给我们生成这个表。创建这个用户表,接下来啊,执行一下迁移。啊,还是在当前目录下PP artis great。
11:03
嗯,这里。报错了,就是说数据库的这个用户名和密码不对啊,我们要去改一下EV。因为是之前新装的项目,我们的数据库因为的配置没有改。好。这个因为我们的项目是运行在虚拟机中,所以。啊,我们这里数据库的话用127.0.1没问题啊,你们注意啊,这个127.0.1不是我们Windows本机的127.01,而是虚拟机里面的这个127.0.1,所以端口号是3306啊,数据库使用我们的API啊,这个API用户名因为是使用的home,所以用户名是。啊,Home stay,密码是这些可以在手册里面都可以查到啊。啊,这样的话就是配置正确了,我们再去。执行6100。迁移成功。刷新一下数据库。
12:01
可以看到已经多了这个优色表,对吧?啊,这时候我们就可以去演示这个例子,但是现在数据库里面没有用户啊,你看这个表里面是。空的没有数据,对不对,我们去添加一些数据啊。ID1。Name a,邮箱a.com后面的除了密码是必填字段,其他的都不是必填字段,密码我们先写成铭文啊,应该按理说应该写成密文,这里我们先写成铭文,接着再加一条。B。好把密码填一下就可以了啊,接着啊。你如果使用的是其他的数据库管理工具,它可能会自动帮你提交了,但是我们使用的是这个皮STEM自带的这个的话,你要在这里啊,要手动去提交到数据库才进行的更新。啊,这时候我们用户就有数据了,来给大家看一下这个例子啊。啊,直接返回,呃,用户的这个所有的一个用户的一个集合。那这里来return user model好好,因为它的结果是个集合嘛,集合它继承了这个model的一个啊。
13:10
类,所以它是可以直接被返回的,那我们进行测试一下啊,当然可以直接在浏览器里面进行测试,请求我们的text是吧,你看我们写到了index里面对不对,Index里面里面应该是请求这个text,你看它执行的index嘛,啊,当然也可以直接在浏览器里面去访问,我们把它改成text。是不是一样的,但是你这样你也看不清楚啊,没有格式化了是吧,所以我们测试API还是要使用专业的啊测试API的工具。来,在这里写上我们请求的方式是get地址啊。api.test请求里面的API里面的test。哎,把我们的地址写完之后发送。啊,这样我们的数据就有了,而且使用。啊,这个postman,它会帮我们把数据化都格式好,并且我们可以很方便的去查看这个头信息,还有携带的一些cookie。
14:02
对吧,甚至我们在请求的时候,还可以很便的很方便的去传一些参数,这些都是浏览器啊做不到的,当然也能查看,你要比较麻烦,你要去这个请求里面啊。找到这个这里面去查看比较麻烦,所以我们测试API就使用。那这个破损慢好。可以看到啊,我们这两个用户的数据被返回了,对吧?啊,当然也可以去返回啊,单个的一个数据啊,这里把注释写一下啊,返回。啊,数据集合吧,好。还可以什么呢?返回单个数据。都是可以的。把这个注释掉线啊。比如范的一,我们返回第一个用户,接着去测试一下。啊,这个时候它就不是数组了,因为反对异常,它就自动给我们转成对象了,那我们在多条的时候,它最外层签到的是一个数组是不是。
15:00
这是关于啊这个响应。啊,它会帮我们把这个响应自动格式化成杰森,并且设置为响应的类型为,啊杰森类型好。接下来看看响应生成器,响应生成器呢,它提供了一个流畅的接口去方便建立和啊,就是定制化的一个响应,通常啊,这个响应的生成器与transform进行结合,然我们还没有学这个。所以。嗯,这个。响应生成器呢,然后这里还给大家演示不了。当然也可以先配置一下,等我们碰到不能演示的再跳过,等学到这里再再说啊好,如果要使用响应生成器,就是要必须去使用啊,订购API提供的这个help的这个啊。因为每个控制器可能都要使用,所以我们可以创建一个基础的控制器,然后让所有的控制器去继承这个基础的控制器就可以了,对吧?我们在基础的控制器里面去继承ctrler,然后我们所有的控制器再继出继承那个基础的这个控制器。
16:07
就可以了啊。啊,当然这样的话也比较麻烦,我们每创建一个控制器都要去手动去继承一下它啊,手动去继承一下它是不是也比较麻烦啊,所以我们干什么呢,直接把这个。呃,写到这个。这个里面吧,这个CTRL里面。啊,写到这个CTRL里面,因为所有的这个控制器,你看都是会继承这个CTRL的啊,我们没必要去再去绕一层。因为我们本来去,呃,继承的东西也不是很多啊,在这里去写就可以了啊,然后在这里去柚子这个help。啊,使用它就可以了,这样我们在创建空隙的时候,就不用每个都去继承一下这个base controll了,但是它例子的话,它是为了你的这个代码就拆分的更细。还有就说。继承了一下,就又创建了一个基本的一个控制器啊,这里我们直接写到这里啊,当我们使用了这个脆之后呢,相当于我们的控制器就具备了这个脆啊,它提供的一些方法和属性啊,所以我们就可以使用啊,比如说do this啊dota就是我们这个。
17:14
啊,这个类里面的这个response啊,其实这个response这个函数提供的啊,它的这个响应,然后去响应一个数组,或者其他的一个响应,来我们看看响应一个数组啊。把这个先注释掉啊。使用响应生成器。响应一个数组啊,这个数组呢,我们就。这么去写啊,先给临时写一下。先给临时写,不用不去查数据库了啊,好,看一看结果来。
18:01
是不是给我们嗯,响应的是一个速度,但是呢,他又把这个结果给我们转成杰森了。知道吧。接着看看怎么去响应一个元素,响应元素呢,嗯,它这个是使用了这个transform和transform进行配合,Transform呢主要是为了可以去,呃,更加定制化,我们的一个响应的一个结果,这就等我们去学传方的时候再说啊。包括这个响应的集合,所有涉及到这个传form的,我们就先跳过,现在没法演示好,接着看一下无内容的一个响应。啊,有时候有些请求我们不必要给用户响应,比如说删除用户删除了一个,执行一个删除操作,你还给他响应干什么啊,直接给他无内容响应就可以,是不是啊无内容。响应啊,直接返回这个no content。好。看一下手册怎么说的。啊,直接请求看一下啊。
19:01
看到了吧,无内容的一个响应,你注意啊,它的状态码是在发生变化的,我们有内容的,它状态码是20啊这个200来把这个打开。看一看。就是当你有内容响应的时候,它的状态码是200啊。当你这个无内容响应的时候,它状态码就变成了204,所以说一般像我们删除或者更新的时候,就没有必要去返回这个数据的时候,就生成了一个无内容的一个响应,它就会啊。生成一个204的一个状态码。等啊。我们把这个给出示了,要把它打开才行。你看是不是生成了一个204的一个啊,Note count的一个响应啊,接着看看其他的一个响应,比如说资源的响应,当我们创建了一个资源,就是比如注册了一个用户,或者新增了一条数据,就可以使用这个创建资源的响应,他呢,结果会啊,其实也跟无内容的响应是一样,只不过它的这个状态码变成了201。
20:00
知道吧。啊,创建资源的响应。来看一下啊。请求一下。是不是这状态码变成201啊,我们会单独抽出来一个章节去讲这些常见的这些二状状态码都表示什么啊?至少大家现在已经知道了几个,200表示这个有数据的一个响应是吧,204表示无数据的一个响应,201表示就是说创建的内容的一个响应,是不是好接着看啊。呃,还可以在第一个参数呢啊,去提供你这个创建资源的一些啊信息。接下来看一看错误的响应。他还给我们提供了很多啊,这个快捷响应错误的啊一些方法。比如可以使用这个error快速的生成一个普通的一个错误的响应,并且可以指定我们的这个状态码。
21:02
看一看啊。把这个注释掉。哎,这里。哎,就给我们生成了一个error,你看这是我们的错误消息,这是我们的状态码。啊,这是具体的,因为我们开启了debug,它会把我们错误产生的这个地方啊,这个对战给我们列出来,包括这个状态码变成了这个404。看到了吧。好。其他的。啊,我就不试了,大家可以自己去试一下,比如没有资源的一个错误。然后是请求的错误,Better request的错误,服务器的这个拒绝的一个错误,内部的错误啊,未认证的错误,这些我们比较常见的一个错误,像未认证的错误,就可能是用户没有登录的话,内部的错误,就是说致命的一个错误,可能我们服务器报错了,包括我们服务器拒绝访问啊,包括这个请求,这个出现这个参数的一些错误什么的,可以用这个啊,包括。啊,用户请求一个地址,或者请求一个资源,没有查到这个数据,给他一个没有资源资源的一个响应,这个比较常用的一些错误响应,当然在响应的时候。
22:07
啊,还可以去呃添加一些响应头啊,使用with它去添加响应头,甚至可以添加这个M信息啊,当然这些也是要配合啊,这个我们的参form母来使用啊,这里我们先不做演示啊。好。嗯,自定义响应格式在配置这里已经稍微介绍一下啊,可以去改这个form啊,Form的一个配置,然后默认的话,它使用的是一个阶层性响应对吧?如果我们想要改成阶层P,你可以,呃,就是去改这里啊,然后如果改成阶层P的话,它就会被一个回调函数给包裹,阶层P的话,我们一般在处理跨域的时候啊就啊可以把它。处理成这个健身P啊。好,这个事件呢,也是跟啊这个传输方母啊,要配合使用,也就是说。
23:04
啊,什么是事件,就当我们转换这个响应的时候。它会触发一个啊,这个什么方法,就是在响应给客户端响应给我们的请求之前,在进行转换的时候,会触发一个啊这两个事件,我们如果想添加一些额外的信息,可以在这个事件里面。啊去添加,比如这里是添加了一个,就是在头部里面去设置了一个link的一个啊头信息,然后写入了这个。写入了这个啊,上一页和下一页的链接啊。然后把它配到这个service里面啊。去监听这个事件,这个事件就能被触发,当然还是要使用这个transform的时候才会触发,现在我们直接使用它也被触发,而且这里本来就是啊做这个。一个例子来讲来演示的啊。当然我们可以去添加其他的一些信息啊,而且它这个例子呢,这里它,呃,这里还会出现一个错误,因为这里已经取了另一个,这里再取另一个,它会出现一个错误,大家尝试的时候要注意这点啊。
24:06
好,这是常见的一些响应啊,接着我们看一看啊,这是它系统给我们提供的一些我们可以快捷使用的一些响应,但是如果这些响应错误的响应不够我们去处理我们的错的话,还有一个章节去啊,专门去处理我们的这个错位响应。啊,如果。我们手动去处理这些API出现的这些错误是比较痛苦的,为了避免手动创建错误,我们可以去实现继承。就是。这些错误的一些基本的一个类啊,会自动就是这个API会自动给我们处理响应啊,这些是常见的一些错误的一些表,包括它的一个状态码。比如啊403是这个啊认证啊未认证一个错误,包括这个400是这个请求错误的一个。啊,错误包括啊这些状态码呢,都是我们比较常见的状态码。比如我们刚才说过的这个。啊,404,你看找不到资源的这个异常,那这些提供的这些异常类怎么用呢?啊,你如果想。
25:06
重写你的这个错误提示的一个类,你只要继承这些类就可以了啊,当然你也可以直接在响应里面去啊,抛出这个异常也可以,这个例子就是直接去抛出了这个异常。好,这里我们去啊,抛出一个什么异常。抛出一个。嗯,就用他这个例子吧。啊,自定义错误处理啊,这里我们来直接抛出一个异常。好,他这里啊,你看这样给你标记上了,就说明是找不着这个,找不着这个啊类啊。啊,这时候其实我们可以去加上这个斜杠,从根啊,从根这个命密空间开始寻找,又能找着,当然你也可以再去头上去柚子去引入它的这个命密空间,也能找到这个类啊,我们就说引入这个命名空间也能去找到这个类,这是我们就加个根啊,不用那么麻烦了,然后。
26:12
嗯,这里是这个类啊,我们去换一个,换一个什么呢?随便换一个吧。比如换一个400的错误请求的一个异常啊。然后我们还可以放上。一些我们自己的一些提示消息是吧,请求错误。好,这时候来看一下啊,我们的test。是不是一个400的一个异常,并且我们的错误消息也有啊,包括这个状态码也变成了400,这个就是我们直接去抛出这个异常,但如果你感觉直接这么去使用比较麻烦的话,你还可以在这个呃,Except里面去创建你的异常类,然后呃,通过这个异常类的方式去使用。啊,都可以的啊。然后这是一些常用的啊,资源异常的一些列表。这些他都会去抛出这个422的一个状态码,嗯。
27:04
来看一下。嗯。比如他这个例子。这个保存失败的时候,你要尝试创建创建用户啊,保存创建失败的时候就可以抛出这个啊这个异常。来也写一下啊。但是前面的逻辑我就不写了,前面呢,他这个逻辑就是进行了一个表单验证嘛,你看表单验证,如果验证没有通过,就是说你不传那个U内pass座的就给我们抛出异常嘛,那我们练习的话,我们就直接去抛出这个异常啊。方便一些。资源异常啊。他们的状态码呢,啊,都是这个,还是从根开始去扫。嗯,这个它是附带了错误的一个消息,行吧,我把前面的这个也写上吧,要不然我们去。
28:03
就是给大家演示一下这个错误的一个消息啊啊。代码比较简单啊,这里就是说啊,定义了我们验证的规则,然后。啊,这里是从。啊,这个请求里面,你看拿到了这两个参数,如果然后去对于我们的请求这个参数进行验证码啊,第一个是要验证的参数,第二个是我们的这个规则,如果我们没有去传这两个参数啊,它就会抛出这个异常,并且会把错误的信息给填上。知道吧,就是验证表单验证的出入信息给附加上。来,我们测试一下。而现在是没有传任何数据,是不是直接请求啊?嗯,不是啊,不是这个地址。把它关掉啊,不保存是我们的这个探的这个地址啊。啊,是不是不能创建这个user,然后这个是我们的error信息,就是我们这里附加的啊,表单验证的它的这个error信息。
29:06
对吧。啊,这个是资源的异常,资源异常的话,它的状态码一般都是422,然后我们常见的资源类型,呃,异常有这几种,比如说这个删除的时候的异常,然后呃,存储时候的异常,包括这个更新时候的一一个异常。这里是简单的举了一个例子。啊。嗯,自定义AP的异常,如果你想要去自定义自己的这个API异常,只要你继承了啊,这个基本的这个异常类啊,或者实现了这个异常类的接口都可以啊。啊,这是。自定义一个异常,当然你自定异常一般我们是放到这个一个产品啊,这个目录下面去创建我们自己的一个异常的一个类,好。啊,接着看一看这个表单请求,如果我们正在使用表单请求。啊,我们不仅要继承API的表单请求类,还要自己去实现啊,这个这两个方法才可以去重写这个异常,但是我们实际上不用这么麻烦,我们直接使用拉入的那个表单验证就可以啊,他就会自己去帮我们去。
30:14
啊,进行一个错误的一个返回,除非你有特殊的需要,就是说如果你喜欢你实现自己的表情请求,你可以去尝试去重写这两个方法。就什么啊,像包括这些自定义的这个啊,一些异常啊,甚至刚才演示的这个例子,其实我们都是。啊,不用也可以啊。先把它出去啊。就是说当我们使用拉的这个表单验证的时候啊,当我出现了异常,它会直接给我们啊,就是进行这个。转换啊,响应成这个定格API的一个阶层的一个异常内。啊,并且状态码也都是对的,可以去这个手册里面去找一下。技术功能看一下表单验证,这里我们去写一下啊。
31:05
好。呃,验证什么呢,我们去。随便去写一个验证码啊。就验证这个吧,好吧。你看这里我们直接使用啊这个。Request啊,去验证这两个字段,那当这两个字段我们没有传递的时候,就是或者不符合我们的这个规则的时候,他会直接帮我们把异常抛除。听到了吧,就不用去再手动抛出这异常,我们使用lower这默认的这个表达证就可以啊,这里我们把request给写进来,Request给依赖注入进来。哎,接下来看一看,我们不传这两个参数啊。是不是直接就验证不通过啊,然后说你这个这个数据有的是没有填写,你像比如title是必须填写的,这个也是必须填写的,对吧,包括异常都是三二,所以和我们这个手动去抛出异常是一样的啊,我们当我们使用这个表单验证的时候。
32:14
所以我们,呃,除非你有特殊的一些需求,一般的情况下你不用去啊,自定义这个异常也够用。
我来说两句