如何请求接口服务

HTTP协议下的请求方式

对于PhalApi,默认是通过HTTP协议进行通信的。根据接口服务的具体实现,可以使用GET或POST方式请求。

访问入口

如前面所言,PhalApi推荐将系统对外可访问的根目录设置为/path/to/phalapi/public。PhalApi的统一访问入口文件是/path/to/phalapi/public/index.php文件。

当配置的域名为:dev.phalapi.net,并且已将根目录设置到public,此时访问的URL是:

  1. http://dev.phalapi.net

当未配置域名,亦未配置根目录时,此时访问的URL是(显然更长更不优雅):

  1. http://localhost/phalapi/public/index.php

如果尚未安装,请先阅读下载与安装

如何指定待请求的接口服务?

默认情况下,可以通过s参数指定待请求的接口服务,当s未传时,缺省使用默认接口服务,即:App.Site.Index。以下三种方式是等效的,都是请求默认接口服务。

  • 未传s参数
  • ?s=Site.Index,省略命名空间,默认使用App
  • ?s=App.Site.Index,带有命名空间前缀

也就是说,当请求除默认接口服务以外的接口服务时,其格式可以二选一:

  • ?s=Class.Action

  • 或者:?s=Namespace.Class.Action
    其中,Namespace表示命名空间前缀,Class为接口服务类名,Action为接口服务方法名,这三者通常首字母大写,并使用英文点号分割。最终执行的类方法是:Namespace/Api/Class::Action()。需要注意的是:

温馨提示:s参数为service参数的缩写,即使用?s=Class.Action等效于?service=Class.Action,两者都存在时优先使用service参数。

关于Namespace命名空间

Namespace是指命名空间中/Api/的前半部分。并且需要在根目录下的composer.json文件中进行autoload的注册,以便能正常自动加载类文件。如默认已经注册的App命名空间:

  1. {
  2. "autoload": {
  3. "psr-4": {
  4. "App\\": "src/app"
  5. }
  6. }
  7. }

当命名空间存在子命名空间时,在请求时使用下划线分割。反过来,当不存在多级命名空间时,命名空间不应该含有下划线。

关于Class接口服务类名

Class接口服务类名是指命名空间中/Api/的后半部分,并且必须是PhalApi/Api的子类。当命名空间存在子命名空间时,在请求时同样改用下划线分割。类似的,当不存在多级命名空间时,命名空间不应该含有下划线。

关于Action接口服务方法名

待请求的Action,应该是public访问级别的类方法,并且不能是PhalApi/Api已经存在的方法。

一些示例

以下是一些综合的示例。

PhalApi 2.x 请求的s参数 对应的文件 执行的类方法
./src/app/Api/Site.php App\Api\Site::Index()
?s=Site.Index ./src/app/Api/Site.php App\Api\Site::index()
?s=Weibo.Login ./src/app/Api/Weibo.php App\Api\Weibo::login()
?s=User.Weibo.Login ./src/user/Api/Weibo.php User\Api\Weibo::login()
?s=Company_User.Third_Weibo.Login ./src/company_user/Api/Third/Weibo.php Company\User\Api\Third\Weibo::login()

上面示例中假设,已经在composer.json中配置有:

  1. {
  2. "autoload": {
  3. "psr-4": {
  4. "App\\": "src/app",
  5. "User\\": "src/user",
  6. "Company\\User\\": "src/company_user"
  7. }
  8. }
  9. }

扩展:如何定制接口服务的传递方式?

虽然我们约定统一使用?s=Namespace.Class.Action的格式来传递接口服务名称,但如果项目有需要,也可以采用其他方式来传递。例如类似于Yii框架的请求格式:?r=Namespace/Class/Action

如果需要定制传递接口服务名称的方式,可以重写PhalApi\Request::getService()方法。以下是针对改用斜杠分割,并换用r参数名字的实现代码片段。

  1. // 文件 ./src/app/Common/Request.php
  2. <?php
  3. namespace App\Common;
  4. class Request extends \PhalApi\Request {
  5. public function getService() {
  6. // 优先返回自定义格式的接口服务名称
  7. $service = $this->get('r');
  8. if (!empty($service)) {
  9. $namespace = count(explode('/', $service)) == 2 ? 'App.' : '';
  10. return $namespace . str_replace('/', '.', $service);
  11. }
  12. return parent::getService();
  13. }
  14. }

实现好自定义的请求类后,需要在项目的DI配置文件./config/di.php进行注册。在最后的加上一行:

  1. $di->request = new App\Common\Request();

这时,便可以通过新的方式来进行接口服务的请求的了。即:

原来的方式 现在的方式
?s=Site.Index ?r=Site/Index
?s=App.Site.Index ?r=App/Site/Index
?s=Hello.World ?r=Hello/World
?s=App.Hello.World ?r=App/Hello/World

这里有几个注意事项:

  • 1、重写后的方法需要转换为原始的接口服务格式,即:Namespace.Class.Action,注意别遗漏命名空间。
  • 2、为保持兼容性,在取不到自定义的接口服务名称参数时,应该返回parent::getService()。
    是不是觉得很好玩?可以立马亲自尝试一下哦。定制你最喜欢的请求方式。

在线接口文档

PhalApi提供一些非常实用而又贴心的功能特性,其中最具特色的就是自动生成的在线可视化文档。在线接口文档主要分为两大类,分别是:

  • 在线接口列表文档
  • 在线接口详情文档
    当客户端不知道有哪些接口服务,或者需要查看某个接口服务的说明时,可借助此在线接口文档。访问在线接口列表文档的URL是:
  1. http://dev.phalapi.net/docs.php

打开后,便可看到类似下面这样的在线接口文档。1.3 如何请求接口服务 - 图1

此在线文档是实时生成的,可根据接口源代码以及注释自动生成。当有新增接口服务时,刷新后便可立即看到效果。通过在接口列表文档,可点击进入相应的接口详情文档页面。

温馨提示:如果打开在线文档,未显示任何接口服务,请确保服务环境是否已关闭PHP的opcache缓存。

如何生成离线文档?

上面在线的接口文档,也可以一键生成离线版的HTML文档,方便传阅,离线查看。

当需要生成离线文档时,可以在终端,执行以下命令:

  1. phalapi$ php ./public/docs.php
  2. Usage:
  3. 生成展开版: php ./public/docs.php expand
  4. 生成折叠版: php ./public/docs.php fold
  5. 脚本执行完毕!离线文档保存路径为:/path/to/phalapi/public/docs

执行后,可以看到类似上面的提示和结果输出。再查看生成的离线文档,可以看到类似有:

  1. phalapi$ tree ./public/docs
  2. ./public/docs
  3. ├── App.Examples_CURD.Delete.html
  4. ├── App.Examples_CURD.Get.html
  5. ├── App.Examples_CURD.GetList.html
  6. ├── App.Examples_CURD.Insert.html
  7. ├── App.Examples_CURD.Update.html
  8. ├── App.Examples_Upload.Go.html
  9. ├── App.Site.Index.html
  10. └── index.html

最后,可以在页面访问此离线版文档,如访问链接:

  1. http://dev.phalapi.net/docs/index.html

原文: http://docs.phalapi.net/#/v2.0/how-to-request