欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

宁皓网 Drupal 8:REST 接口

Drupal 8 的核心自带了 Web 服务的功能,它可以把我们的 Drupal 变成一个数据中心,用户可以通过 REST 方法,从我们这里得到想要的数据,也可以把他们的数据存储到我们的 Drupal 里面。 在这个课程里,我们就去了解一下怎么样使用这个 REST 功能。

来自  
https://ninghao.net/course/3335#info

 
介绍与准备
1)RESTful Web 服务 - 介绍

Web Service 可以翻译成 Web 服务 .. Web 服务就是两个电子设备之间通过 Web 相互沟通的一种方法 .. 比如用户的手机可以使用 Web Service 跟我们的服务器之间沟通 .. 得到服务器上的某些内容资源 ..

REST 是一种软件架构,它其实就是实施 Web Service 的一种方法,提供了一些标准,描述了怎么样去使用 Web Service ..

Drupal 8 的核心自带了 Web 服务的功能,它可以把我们的 Drupal 变成一个数据中心,用户可以通过 REST 方法,从我们这里得到想要的数据,也可以把他们的数据存储到我们的 Drupal 里面。 在这个课程里,我们就去了解一下怎么样使用这个 REST 功能。

来自  https://ninghao.net/video/3337#info

2)启用 Web Services 相关模块

Drupal 8 核心自带了 Web Services ,不过默认是关闭的状态,我们需要先去启用一下 .. 登录到管理后台以后 .. 打开 扩展 .. 在 Web 服务这个区域里面,可以找到一些相关的模块 .. 勾选一下这些模块 ..

HAL .. 提供了一种特殊的数据格式 ... HTTP Basic Authentication, 这个模块提供了一个使用 Basic Auth 验证用户身份的方法 .. 它会在用户发出请求的时候在请求里包含用户名还有密码 .. 所以在正式的网站上使用这种方法验证用户身份的时候,你需要使用 SSL 加密传输 ..

RESTful Web Services 是主要的让 Drupal 提供 Web 服务的一个模块 .. Serialization 模块提供了一种处理输出的数据格式的功能。

我们可以勾选一下这几个模块,再去安装一下 .. 或者也可以使用 drush 去安装 .. 打开终端 .. 登录到虚拟机 .. 然后进入到 drupal 项目所在的目录 .. 再用一下 drush 的 en 这个命令 .. 后面列出要启用的模块 .. hal baisc_auth rest 还有 serialization .. 加上一下 -y 的选项 .. 执行一下 ..

这里出现了一个警告的信息 .. 提示我们得去把 php 的 always_populate_raw_post_data 这个配置的值设置成 -1 .. 去编辑一下 php 的配置 .. sudo vi /etc/php.ini ..

按一下 / ,搜索 always_populate_raw_post_data ,找到以后,去掉这行配置前面的分号 .. 再保存一下这个配置文件 .. 然后重启一下 php-fpm ,sudo systemctl reload php-fpm ..

重新执行一下之前的 drush 命令 .. 这回就提示安装成功了 .. 这里还会提示 rest 这个模块里面定义了几个权限 ..

来自 https://ninghao.net/video/3338#info

获取资源
3)GET:获取一个内容实体

下面我们用 POSTMAN 这个工具先去试一下,使用 HTTP 的 Get 方法,去得到一个节点内容 .. 有个权限可以先看一下 .. 打开 用户 .. 权限 .. 找到 RESTful Web Services .. 如果你想让用户可以使用 GET 方法得到内容资源 .. 需要为用户对应的角色勾选一下 Access GET on 内容 resource 这个权限 ..

比如这里我们给匿名用户分配一个这样的权限 .. 保存一下 ..

然后打开 内容 .. 找到一个内容 .. 复制一下内容的地址 .. 再打开 POSTMAN .. 在 Chrome 浏览器上安装的应用,可以 chrome://apps 这个地址里面找到 .. 找到这个 POSTMAN ..

先把要请求的地址粘贴过来 .. 在这个地址的后面加上一个 ?_format=hal_json ,去指定一下返回的内容的格式 ..

请求的方法选择 GET ... 然后再添加一个 Header .. 名字是 Accept .. 对应的值是 application/hal+json ..

然后点击发送 .. 服务端返回的状态码是 200 ... 表示请求成功了 ..

在下面会显示出 Drupal 给我们返回来的内容 .. 你可以在应用里使用这个对象里的东西 .. 先简单的浏览一下 ..

type .. 是内容的类型 .. title 是内容的标题 .. body 是内容的主体 ... field_name ,这是我们给电影这个内容类型添加的一个自定义的字段 .. 下面的 field_release_date 也是一个自定义的字段 .. 它的值表示的是电影的发行日期 ..

来自 下面我们用 POSTMAN 这个工具先去试一下,使用 HTTP 的 Get 方法,去得到一个节点内容 .. 有个权限可以先看一下 .. 打开 用户 .. 权限 .. 找到 RESTful Web Services .. 如果你想让用户可以使用 GET 方法得到内容资源 .. 需要为用户对应的角色勾选一下 Access GET on 内容 resource 这个权限 ..

比如这里我们给匿名用户分配一个这样的权限 .. 保存一下 ..

然后打开 内容 .. 找到一个内容 .. 复制一下内容的地址 .. 再打开 POSTMAN .. 在 Chrome 浏览器上安装的应用,可以 chrome://apps 这个地址里面找到 .. 找到这个 POSTMAN ..

先把要请求的地址粘贴过来 .. 在这个地址的后面加上一个 ?_format=hal_json ,去指定一下返回的内容的格式 ..

请求的方法选择 GET ... 然后再添加一个 Header .. 名字是 Accept .. 对应的值是 application/hal+json ..

然后点击发送 .. 服务端返回的状态码是 200 ... 表示请求成功了 ..

在下面会显示出 Drupal 给我们返回来的内容 .. 你可以在应用里使用这个对象里的东西 .. 先简单的浏览一下 ..

type .. 是内容的类型 .. title 是内容的标题 .. body 是内容的主体 ... field_name ,这是我们给电影这个内容类型添加的一个自定义的字段 .. 下面的 field_release_date 也是一个自定义的字段 .. 它的值表示的是电影的发行日期 ..

来自 https://ninghao.net/video/3340#info

身份验证
4)Basic Auth:基本身份验证

Drupal 提供了一些身份验证的方法,在这个视频里我们看一下 Basic Auth ... 打开扩展 .. 找到 Web 服务这个区域 .. 使用 Basic Auth ,需要勾选一下这里的 Http Basic Authentication 模块 ..

再打开 用户 .. 权限 .. 找到 RESTful Web Services .. 我们之前为匿名用户勾选了这个使用 GET 方法访问内容资源的权限 .. 先取消一下这个权限 .. 再保存一下 ..

打开 POSTMAN .. 再使用 GET 方法访问一下这个地址 ... 发送 .. 在返回的内容这里,打开 Raw ,也就是原始内容 .. 这里提示网站遇到了不可预知的错误 .. 再看一下这个返回来的状态码 .. 是 401 Unauthorized .. 意思就是没有授权访问这个资源 ..

因为我们去掉了让匿名用户可以使用 GET 方法访问内容资源的权限 .. 下面我们用一下 Basic Auth 的方法验证一下用户的身份 ..

打开 Authorization .. 选择 Basic Auth .. 让我们输入用户名 .. 这里输入一个管理员的用户名 .. 因为默认他会有权限访问这个资源 .. 再输入对应的密码 .. 这个用户名跟密码就是用户在 Drupal 网站上的用户名还有密码 ..

完成以后点一下 Update Request ,更新请求 .. 打开 Headers .. 注意这里在发送请求的时候,会多出一个头部信息 .. 名字是 Authorization .. 对应的值是一个 Basic 空格 .. 后面是使用 Base 64 编码的用户名还有密码 .. 注意这里并不是加密的信息 .. 而是编码 .. 所以如果你在真正的应用里使用这种 Basic Auth 方法验证用户的身份的话 .. 你需要使用 SSL 加密传输信息 .. 就是使用 https .. 你可能需要去申请一个 SSL 证书,每年要花点钱 .. 不过据说现在有地方可以免费申请 SSL 证书 ..

点一下 Send ,发送 .. 预览的格式选择 Pretty .. 你会看到,这次请求,用户使用 Basic Auth 的方法通过了 Drupal 的身份验证 .. Drupal 返回了用户请求的内容 ..

来自 https://ninghao.net/video/3342#info

发布资源
6)POST:发布内容资源:理解内容的结构

我们可以使用 HTTP 的 POST 方法,把内容放到 Drupal 里面去存储一下 .. 在发送这种请求之前,你需要了解提交的内容的结构 ... 先看一下之前我们用 GET 方法请求回来的这个内容资源 ..

首先要在提交的数据里面包含一个 _links 属性 .. 在它里面再添加一个 type .. 这个 type 里面是一个 href 属性 .. 对象的值是一个地址 .. 先是网站基本地址 .. 然后是内容的类型 .. rest/type/node/ 意思是我们要提交的内容是节点类型的资源 .. 后面还要加上对应的节点类型的名字 .. 在这个内容资源里面是 movie .. 也就是电影这个内容类型 .. 它是我们在介绍字段的课程里创建的一个内容类型 ..

然后就是一些具体的内容 .. 比如我们需要指定内容的类型 .. 找到这个 type 属性 .. 它的值是一个数组 .. 里面的项目都是对象 .. 对象里有一个 target_id 属性 .. 对应的值就是内容的类型的名字 .. 这里是 movie ,就是我们创建的电影这个内容类型 ..

另外你至少要提供一个内容的标题 .. 是在 title 这个属性里面 .. 注意它的值是一个数组 .. 里面的每个项目都是一个对象 .. 因为 Drupal 支持多语言 . . 所以你的内容可以有多种语言 .. 标题的具体的值对应的属性的名字是 value .. 你在使用 POST 方法提交内容给 Drupal 的时候也需要使用这种内容结构 ..

如果你还想提供内容里的其它字段的内容 .. 可以找到对应的属性 .. 比如内容的正文 .. 就是这个 body 属性 .. 它的值也是一个数组 .. 里面的项目都是对象 .. 这个对象里面有一些属性 .. value 属性对应的是这个 body 字段的具体的值 ..

另外还有一些其它的属性 .. 比如 format ,表示内容的格式 .. 这里用的是 restricted_html ,表示用的是受限制的 html 这种文本格式 .. summary 是内容的摘要 .. lang 是内容使用的语言 .. zh-hans 表示简体中文 ..

来自 https://ninghao.net/video/3344#info

7)POST:发布内容资源

下面我们就去使用 POST 方法向 Drupal 提交一个新的内容 .. 还是在 POSTMAN 这个工具里去试一下 .. 在提交内容的时候你可以参考这个使用 GET 方法获取到的内容里的结构 .. 我们再新建一个标签 ..

先指定一下请求的地址 .. 先是网站的基本的地址 .. 然后加上 entity/node 意思是我们要往 node 这种内容上面去提交内容资源 .. 后面再指定一下格式 .. ?_format=hal_json

请求的方法,选择 POST .. 因为我们要提交内容给 Drupal ..

设置一下请求的 headers .. 先添加一个 Accept .. 它的值是 application/hal+json .. 再添加一个 Content-Type .. 它的值也是 application/hal+json .

然后打开 Authorization .. 选择 Basic Auth .. 输入用户名 .. 密码 .. 因为使用 POST 方法提交内容资源需要验证用户的身份 .. 有权限的用户才能干这件事儿 .. 更新一下 ..

再打开 Body 这个标签 .. 这里就是提交请求的时候具体要提交的内容 .. 格式选择 raw .. 然后手工输入一下要提交给 Drupal 的内容 .. 先是一个对象 .. 它里面先添加一个 _links 属性 .. 它的值是一个对象 .. 再添加一个 type 属性 .. 对象的值也是一个对象 .. 然后是一个 href 属性 .. 它的值是网站的基本的地址 .. 加上一个 rest/type/node .. 因为我们要提交的内容资源属于 node,也就是节点类型的内容 .. 后面再加上一个具体的内容类型的名字 .. 比如我想往文章这个内容类型上添加一个新的内容 .. 这里设置成 article .. 它是文章内容类型的机器名 ..

跟 _links 属性并列 .. 再添加一个新的属性 .. 名字是 type .. 它的值是一个数组 .. 里面添加一个对象 .. 在这个对象里用一个 target_id 属性 .. 对应的值是要提交的内容存储到的那个内容类型的名字 .. 这里设置成 article ..

再去添加一个 title 属性 .. 这个属性跟 _links,还有 type 属性是并列的 .. 它的值是一个数组 .. 里面再添加一个对象 .. 然后用一个 value 属性 .. 对应的值就是要提交的内容的标题 .. 设置成 来自 POSTMAN ..

最后我们再添加一个 body 属性,设置一下内容的正文 .. 它的值是一个数组 .. 里面添加一个对象 .. 用一个 value 属性 .. 设置一下正文内容 .. 这是一个在 POSTMAN 上发布的内容 ..

下面,我们就可以发送一下这个请求了 .. 点击 发送 .. 状态码是 201 .. 表示内容创建成功 .. 再回到 Drupal 的后台去看一下 .. 打开内容 ... 在这里你会找到我们刚才用 POSTMAN 发布的一个内容 ..

内容的类型是 文章 .. 可以再打开这个内容看一下 .. 在这个内容的页面上会显示内容的正文 ..

来自  https://ninghao.net/video/3345#info

更新资源
8)PATCH:更新内容资源:理解内容的结构

使用 HTTP 的 PATCH 方法向 Drupal 的特定内容资源提交请求,可以去更新这个内容资源里的内容 .. 之前我们使用 POST 方法发布了一个新的文章类型的内容 .. 这个内容的 ID 是 31 .. 我们还用 GET 去请求一下这个内容资源 ..

打开 POSTMAN .. 再打开一个之前我们使用 GET 方法的请求 .. 修改一下请求的地址 .. 这里就是 node/31 .. 发送一个这个请求 ..

想要更新这个内容资源的话 .. 需要在请求里面,用一个 _links .. 里面应该有一个 type 属性 .. 设置一下 href 属性的值 .. 想要更新这个内容资源,这个 href 属性的值就应该是网站的基本的地址 .. 加上 rest/type/node/article ..

然后在请求里要包含想要修改的地方对应的属性 .. 还有具体要改的值 .. 比如我想改一下它的发布状态 .. 可以找到 status 这个属性 .. 它的值是一个数组 .. 里面是一些对象 .. 对象里的 value 属性的值表示的就是这个内容资源的发布状态 .. 1 表示已发表 .. 把它设置成 0 应该就是未发表的状态 ..

想要修改它的标题 .. 可以找到 title 这个属性 .. 它的值也是一个数组 .. 里面是一些对象 .. 对象里有一个 value 属性 .. 对应的值就是标题的内容 ..

在使用 PATCH 方法提交更新内容请求的内容 .. 我们需要使用跟这里一样的数据结构去组织请求里包含的具体的内容 .. 这样 Drupal 才能正确的处理请求,做出反映 ..

来自 https://ninghao.net/video/3347#info

9)PATCH:更新内容资源

下面我们可以去使用 http 的 PATCH 方法更新一个内容资源 .. 打开 POSTMAN .. 先设置一下请求的地址 .. 先是网站的基本的地址 .. 加上具体的内容的地址 .. 这里就是 node/xx .. 这个内容是我们之前创建的一个文章类型的内容 .. 后面再加上一个 ?_format=hal_json

然后选择一下请求的方法 .. 更新内容,用的是 PATCH 这个方法 .. 再设置一下请求的头部 .. 打开 Headers .. 添加一个 Accept .. 它的值是 application/hal+json .. 然后是 Content-Type .. 对应的值也是 application/hal+json ..

打开 Authorization .. 选择 Basic Auth .. 输入用户名 .. 还有密码 .. 你要确定这个用户权限使用 PATCH 方法提交内容资源 .. 在 Drupal 的后台可以设置用户的权限 .. 更新一下 ..

再打开 Body .. 设置一下具体要提交的内容 .. 类型选择 Raw .. 表示原始的数据 .. 然后使用正确的数据结构去组织一下想要提交的内容 ..

先是组花括号 .. 里面添加一个 _links .. 它的值是一个对象 .. 里面用一个 type 属性 .. 值也是一个对象 .. 再添加一个 href 属性 ... 它的值是网站的基本的地址 .. 加上 rest/type/node/article .. 意思是这个内容资源属于 node ,也就是节点类型 .. 具体的类型是 article .. 也就是文章这个内容类型 ..

我想让这个内容的发布状态变成未发布 .. 所以这里需要用一个 status 属性 .. 它的值是一个数组 .. 里面是一个对象 .. 添加一个 value 属性 .. 它的值设置成 0 ,表示未发布 .. 如果设置成 1 就表示已发表的状态 ..

可以再去改一下它的标题 .. 使用一个 title 属性 .. 值是一个数组 .. 里面是一个对象 ..对象里添加一个 value 属性 .. 对应的值就是要修改的标题内容 .. 设置成 .. 使用 PATCH 方法修改了标题 ..

下面, 我们就可以去发送一个这个 PATCH ,更新内容资源的请求了 .. 点一下 发送 ..

服务端返回了一个 204 的状态码 .. 再打开 Drupal .. 注意这个内容的标题 .. 刷新一下 .. 现在这个内容的标题就变成了刚才我们使用 PATCH 方法修改之后的标题了 ..

再打开 内容 ..

这里你会看到,使用 PATCH 修改的这个内容 .. 它的状态变成了 Unpublished .. 表示未发布 ... 这些就是使用 PATCH 方法更新的东西 ..

来自 https://ninghao.net/video/3348#info

删除资源
10)DELETE:删除内容资源

使用 http 的 DELETE 这个方法可以去删除内容的资源 .. 下面我们就用这个方法,去把之前用 POST 发布的,PATCH 方法修改的这个内容删除掉 ..

打开 POSTMAN .. 新建一个标签 .. 设置一下请求的地址 .. 这里就是网站的基本地址 .. 加上要删除的内容的地址 .. 请求的方法选择 DELETE .. 这个方法也需要有权限的用户去执行 .. 所以我们需要某种身份验证的方法 .. 这里可以使用 Drupal 自带的 Basic Auth ..

打开 Authorization .. 选择 Basic Auth ... 输入用户名 .. 密码 .. 再更新一下 .. 注意在正式的应用里使用这种方法验证用户身份的话,你需要使用 SSL 去加密传输 ..

设置好以后 .. 去发送一下这个请求 .. 点击 发送 .. 这里返回的状态码是 204 ...

再回到这个内容的页面 ... 刷新一下 .. 提示页面没找到 .. 之前用 POST 发布的内容就不见了 .. 因为我们用 DELETE 方法把它给删除掉了 ..

来自 https://ninghao.net/video/3350#info

资源列表
11)GET:内容资源列表

之前我们介绍过使用 GET 方法请求单个的内容资源 .. 如果你想得到一个内容的列表 .. 可以去创建一个 REST 类型的视图显示 .. 打开 Drupal 的管理后台 .. 结构 ... 找到 视图 ..

我们可以去创建一个新的视图 .. 添加新的视图 .. 视图的名字可以随便定义 .. 这里我把它设置成 rest .. 显示 内容 .. 类型选择 电影 .. 保存一下 ...

安装了 Web 服务里的 rest 模块以后,在可以使用的视图显示里面,会多了一个 REST export .. 添加一个这样的显示 .. 然后设置一下它的路径 ... 比如 api/movie .. 保存一下 ..

打开 POSTMAN .. 这里我们可以请求一下刚才创建的 REST export 类型的视图显示输出的东西 .. 请求的地址是网站的基本地址 .. 加上一个 api/movie .. 请求的方法选择 GET .. 再发送一下这个请求 ..

在下面会显示返回来的结果 .. 默认这个返回的数据的格式应该是 JSON .. 里面就是一些电影内容 .. 如果你想得到 hal json 格式,可以去设置一下 .. 回到 Drupal 的后台 .. 在 格式 这里 .. 点击 Serializer 后面的设置 .. 选择接受的请求格式 .. 勾选一下 hal_json .. 应用 .. 再保存一下 ..

回到 POSTMAN .. 重新再发送一下这个请求 .. 现在得到的电影内容里面,会多了一个 _links 还有 _embedded ..

来自 https://ninghao.net/video/3352#info

12)GET:内容资源列表 - 自定义字段

在上一个视频里我们创建了一个 REST export 类型的视图显示 .. 请求它返回的项目是完整的实体内容 .. 就是每个项目里面包含内容上的所有的字段 ..

我们也可以去设置一下,只让它返回特定的字段内容 .. 回到 Drupal 的视图配置界面 .. 在格式这个区域里 .. 点击 显示 后面的 实体 .. 然后选择 字段 .. 再应用一下 ..

在这里我们可以给字段的名字设置一个别名 .. 先再应用一下 .. 现在,在这个 字段 区域里面,我们可以去配置想要使用的字段 .. 默认这里只有一个 标题 字段 . . 保存一下视图 ..

回到 POSTMAN .. 再请求一下 api/movie 这个地址 .. 现在 Drupal 返回的内容里面,每个项目里面只会包含一下 title 属性 .. 对应的值就是内容的标题 ..

注意这个标题的周围都有一个链接的 a 标签 .. 如果只希望得到标题上的文字,可以再去配置一下这个字段 .. 回到 Drupal 的视图配置界面 .. 点开这个 标题 字段 .. 去掉这个 链接到 内容 .. 应用 ... 再保存一下这个视图 ..

回到 POSTMAN ,重新请求一下 .. 现在返回来的内容里面, title 属性的值就是内容的标题文字 .. 没有多余的东西 ..

来自 https://ninghao.net/video/3353#info

13)GET:内容资源列表 - 分页

在这个 REST export 类型的视图里面 .. 我们也可以使用分页器去分页得到内容的列表 ... 回到视图的配置界面 .. 找到 分页器 这个区域 .. 配置一下,让这个视图使用分页 .. 选择 使用完整分页器分页输出 .. 也可以选择 使用迷你分页器分页输出 ..

应用一下 .. 再配置一下这个分页功能 .. 我们让它每页显示三个项目 .. 因为在我的网站里面没有太多的内容 .. 应用 .. 再保存一下这个视图 ..

回到 POSTMAN .. 再请求一下这个 api/movie .. 这次 Drupal 只给我们返回了三个项目 .. 因为我们配置的分页功能,让它每页只显示三个项目 ..

得到其它页上的内容,可以设置一下请求的地址 .. 添加一个 ?page= 后面是分页的号码 .. 输入一个 1 .. 这回得到的就是第二页内容 ..

换成 page=2 .. 再请求一下 .. 没有可以显示的内容了就会返回一个空白的数组 ...

来自 https://ninghao.net/video/3354#info


普通分类: