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

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

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

http://dev.phalapi.net

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

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命名空间:

{
    "autoload": {
        "psr-4": {
            "App\\": "src/app"
        }
    }
}

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

关于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中配置有:

{
    "autoload": {
        "psr-4": {
            "App\\": "src/app",
            "User\\": "src/user",
            "Company\\User\\": "src/company_user"
        }
    }
}

开启URI路由匹配
注意!本功能需要PhalApi 2.7.0 及以上版本方可支持。

任何情况下,PhalApi都会优先通过service参数,其次是s参数(也就是service的短参数)来定位当前客户端请求的是哪一个接口服务。

当客户端未提供service参数,亦未提供s参数时,可以通过开启sys.enable_uri_match尝试进行URI路由匹配。

先通过几个例子来了解开启URI路由匹配后的访问效果,以下效果是等效的。

# 通过service指定
http://dev.phalapi.net/?service=App.Usre.Login

# 开启URI路由匹配后
http://dev.phalapi.net/App/User/Login

# 省略App默认命名空间
http://dev.phalapi.net?s=App.Usre.Login

# 开启URI路由匹配后
http://dev.phalapi.net/User/Login

原理很简单,当未提供service参数和s参数时,并且是开启sys.enable_uri_match后,客户端可以通过/Namespace/Class/Action这样的URI访问接口服务。

除了要在./config/sys.php修改enable_uri_match配置为true外,还需要同步进行Rewrite规则配置,以便让你的服务在未找到文件时把请求转发给index.php处理。参考以下Nginx配置:

server {
    listen 80;
    server_name dev.phalapi.net;
    root /path/to/phalapi/public;
    charset utf-8;

# 开启URI路由匹配
    location / {
        try_files $uri $uri/ $uri/index.php;
    }
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php last;
    }

location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

access_log logs/dev.phalapi.net.access.log;
    error_log logs/dev.phalapi.net.error.log;
}

路由如何匹配?
开启路由匹配,并且正确配置Nginx或Apache的Rewrite规则后,客户端可以通过以下方式访问接口服务:

常见的路径:/Namespace/Class/Action
常见的路径,且带有GET参数:/Namespace/Class/Action?xx=123
常见的路径,且前面包含index.php文件:/index.php/Namespace/Class/Action
常见的路径,且同时包含index.php文件和GET参数:/public/index.php/Namespace/Class/Action?xx=123
类似地,如果Namespace是App,那么可以忽略不写,即有:

默认App,常见的路径:/Class/Action
默认App,常见的路径,且带有GET参数:/Class/Action?xx=123
默认App,常见的路径,且前面包含index.php文件:/index.php/Class/Action
默认App,常见的路径,且同时包含index.php文件和GET参数:/public/index.php/Class/Action?xx=123
下面是针对登录接口的例子:

// 常见的路径
http://dev.phalapi.net/App/User/Login

// 常见的路径,且带有GET参数
http://dev.phalapi.net/App/User/Login?username=dogstar&password=123456

// 常见的路径,且前面包含index.php文件
http://dev.phalapi.net/index.php/App/User/Login

// 常见的路径,且同时包含index.php文件和GET参数(入口文件必须是index.php,前面目录路径可自定义)
http://dev.phalapi.net/public/index.php/App/User/Login?username=dogstar&password=123456

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

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

// 文件 ./src/app/Common/Request.php

<?php
namespace App\Common;

class Request extends \PhalApi\Request {

public function getService() {
        // 优先返回自定义格式的接口服务名称
        $service = $this->get('r');
        if (!empty($service)) {
            $namespace = count(explode('/', $service)) == 2 ? 'App.' : '';
            return $namespace . str_replace('/', '.', $service);
        }

return parent::getService();
    }
}

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

$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()。
如果想再进行URL路由的美化,可以结合重定向配置来使用。

例如Nginx参考配置:

if (!-e $request_filename) {
    rewrite ^/(.*)$ /index.php?r=$1 last;
}

例如Apache参考配置:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/?r=$1 [QSA,PT,L]
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
</IfModule>

又如IIS参考配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/?r={R:1}" appendQueryString="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

最终效果会类似,当访问:http://api.phalapi.net/user/login,就会变成:http://api.phalapi.net/?r=user/login,然后触发上在的扩展规则,最终等效于:http://api.phalapi.net/?s=user.login

PhalApi 如何请求接口服务相关推荐

  1. PhalAPI学习笔记 ——— 第二章接口服务请求

    PhalAPI学习笔记 --- 第二章接口服务请求 前言 接口服务请求 接口服务请求案例 自定义接口路由 开启匹配路由 配置路由规则 nginx apache 服务请求 结束语 前言 公司业务需要转学 ...

  2. 十年一遇的奇葩故障--Windows网络编程接口故障:telnet显示无法加载或初始化请求的服务提供程序...

    现象:某同事的笔记本win7x64系统,当初故障是无法使用小乌龟连接到svn服务器,但又可以正常上网,并且svn服务器端是正常的. 后来我进一步测试,发觉该电脑也不能连接到远程windows. net ...

  3. 批量调取接口_批量请求接口-API文档-开发指南-Web服务 API | 高德地图API

    产品介绍 特别说明:受产品策略调整影响,自2020年11月起,建议您不再使用此批量接口.后续平台会逐步废弃并下线此服务. 批量接口通过用户传入合并后的请求,同时返回多个请求的顺序集合,目前最多支持20 ...

  4. 接口返回的类型是html页面_1.10 PhalApi 2.x 接口文档

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

  5. HttpClient 如何设置请求接口等待时间

    我们在请求接口的时候容易出现请求超时的现象,出现这一问题的原因可能是接口确实挂了,也可能是接口还没有来的及响应,我们程序里面已经出现了请求超时的现象 问题描述: 通常会出现以下的报错: java.ne ...

  6. 怎样不停请求接口实现实时刷新_Hologres+Flink实时数仓详解

    简介: 本次内容将会介绍使用Flink和Hologres,实现可扩展的.高效的.云原生实时数仓. 一.Hologres生态 从前面几篇的内容,相信大家已经了解到Hologres是一款兼容Postgre ...

  7. python接口服务两种方式(被调用、主动推送)

    项目中用python开发,要对外接口时,根据场景不同,一般有两种方式: 外部调用python接口,返回数据 接口主动向外部推送数据 1外部调用python接口,返回数据 这种方式一般可以通过http接 ...

  8. Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7932268 在前面一篇文章中,我们分析了And ...

  9. Android应用程序请求SurfaceFlinger服务创建Surface的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7884628 前面我们已经学习过Android应 ...

  10. java http请求实现_java工程实现http请求接口

    java工程实现http请求接口 java工程实现http请求接口 1.实现代码 package com.home; import com.alibaba.fastjson.JSON; import ...

最新文章

  1. 科学家发现跨越生命的重要门槛或许没那么难
  2. Android实战技巧之三十七:图片的Base64编解码
  3. DNN数据库核心表结构及设计思路探研
  4. 边记边学PHP-(十五)MySQL数据库基础操作2
  5. java对jar包的复制_Java安全之jar包调试技巧
  6. linux gcc 示例_最好的Linux示例
  7. WebDriverException: Cannot find firefox binary in PATH.的解决方法
  8. qt android 网络编程实例,QT网络编程Tcp下C/S架构的即时通信实例
  9. android 之手机拨号器,以及短信发送器的简单实现
  10. 为什么建议要延迟macOS升级,小编为你全面分析!
  11. WinZip 18.0下载地址及注册码
  12. 拼多多通用优惠券漏洞被薅羊毛数千万 你的系统有反作弊防护吗?
  13. centos安装LDAP即配置
  14. android底部滑动出现虚拟按键,Android适配底部虚拟按键的方法详解
  15. laravel Specified key was too long 解决方案
  16. VUE动态展示表格字段
  17. sql查询之联合查询
  18. KNN分类——matlab(转载)
  19. onbeforeunload设置用户关闭离开页面时提醒用户保存信息
  20. 网秦发家-隐性的sp赚钱的暴富

热门文章

  1. 计算机网络在化学中的应用论文,计算机在化学中应用
  2. Seagate 日立硬盘型号命名规则
  3. rfc3315_DHCPv6-RFC3315(中文).pdf
  4. 电脑连上Jink后打开Altium Designer弹出Failed to measure TotalIRLen(6)
  5. 网站关键词密度设置与优化
  6. rc时间常数定义_时间常数RC的计算方法
  7. 八皇后算法—java
  8. python seo 采集内容_SEO如何处理采集内容(4)–转自{GoGo闯}
  9. ASEMI肖特基二极管1N5819压降是什么意思
  10. 软件测试怎么学比较快